无符号数字与负数(编程细节)
首先运行一段程序,结果出现之前可以预测一下结果哦!
#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 。