无符号数字与负数(编程细节)

首先运行一段程序,结果出现之前可以预测一下结果哦!

#include <iostream>  
#include <string.h>  
using namespace std;  

int main()  
{  
    if(strlen("abc") < -1)  
    {  
        cout << strlen("abc")<<"    yes1" << endl;
    }  
    else  
    {  
        cout << "no1" << endl;  
    }  

    if(sizeof("abc") < -1)  
    {  
        cout << sizeof("abc")<<"   yes2" << endl; 
    }  
    else  
    {  
        cout << "no2" << endl;  
    }  

    if(string("abc").size() < -1)  
    {  
        cout << string("abc").size()<<"  yes3" << endl; 
    }  
    else  
    {  
        cout << "no3" << endl;  
    }  

    return 0;  
}  

—————————————————————分割线——————————————————————————————-
这是运行的结果:

3   yes1
4   yes2
3   yes3

3明显是大于-1 的,,那为什么会输出yes呢??
因为std::size_t strlen( const char* str );它的返回类型是std::size_t。
再看size_t等同于什么类型:
这里写图片描述
这里说他类似与unsigned int 类型。在32位的系统中他相当于unsigned int 占有4个字节,,但是在64位操作系统下,它相当于unsigned long 占有8个字节,所以有可能它的值比Int大。。。
一般不要使用int lenght = strlen(string_a); 这样的语句,他可能会超出int 范围,,当然应该也没人会一下输入那么长的字符串。
这里的-1 会被 转化为一个很大的无符号数字,

    int a =-1;
    unsigned int b =a;
    cout<<b<<endl;

使用上面的代码测试一下:

b = 4294967295

2的32次方就是4294967296,,故-1就是2的32次方减去1 。
一个32位的负数值是-N,那么转化成unsigned的值是2^32 - N 。

posted @ 2018-04-01 15:49  W_K_L  阅读(24)  评论(0编辑  收藏  举报