无符号数与有符号数相比较
先来看一段代码
#include<stdio.h>
int i = 0;
int main()
{
i–;
if(i>sizeof(i)){
printf(">\n");
}
else{
printf("<\n");
}
return 0;
}
这段代码的输出结果是什么?
结果出乎意料:>
缓缓地打出三个问号 ???
下面就来分析一下问什么会出现这种情况
i = 0;(初始值)
i = -1;(i–执行后)
sizeof(i) = 4;
那么就是判断(i > sizeif(i) = 4)?
i= -1 已经是不能改变的,那么问题就一定出现在(sizeof()函数上)
经过查询,可以发现sizeof()函数的返回值是无符号整型,那又能说明什么呢?
i = -1; i 是一个有符号数;而sizeof()返回值是无符号数,结果是i > sizeof(i),那么至此。可以得出一个结论:
当无符号数和有符号数进行运算时,会将所有的数都当作无符号数来运算
我们知道,数据在内存中是以二进制补码的形式存储的,-1是有符号数,所以它的最高位符号位必定是1,当它和sizeof(i)比较时,会将它当作无符号数进行比较,即将它所有的二进制序列当作数值位,那么将会是一个非常大的数,所以就会出现上面的结果。
破案了!