先看一段代码
#include<stdio.h>
int i; // i是全局变量,不初始化,则默认为0
int main(void)
{
i--;
if(i > sizeof(i))
printf(">\n");
else
{
printf("<\n");
}
return 0;
}
错误的想法:
i 是全局变量,没有初始化,默认为0. 因此 i-- 操作以后,i 的值为 -1. sizeof操作符将返回 i (int类型)的字节为 4.因此 i < sizeof(i),所以打印 " < "
分析:
sizeof 算出的结果返回的类型是 unsigned int 型,而 i 是 int型。
在将int型与unsigned int型做对比时,会先把 int 型准换为 unsigned int型,然后再进行比较。-1 的补码为1111 1111 1111 1111 1111 1111 1111 1111,转换为unsigned int 类型,表示非常大的数,因此,应该打印 " < "
知识点:
计算机中32位int类型变量的范围,其中int类型是带符号整数。
正数在计算机中表示为原码,最高位是符号位:
1的原码为 0000 0000 0000 0000 0000 0000 0000 0001
2147483647的原码为 0111 1111 1111 1111 1111 1111 1111 1111
所以最大的正整数是 2147483647
负数在计算机中表示为补码,最高位为符号位:
-1
原码为 1000 0000 0000 0000 0000 0000 0000 0001
反码为 1111 1111 1111 1111 1111 1111 1111 1110
补码为 1111 1111 1111 1111 1111 1111 1111 1111
-2147483647
原码为 1111 1111 1111 1111 1111 1111 1111 1111
反码为 1000 0000 0000 0000 0000 0000 0000 0000
补码为 1000 0000 0000 0000 0000 0000 0000 0001