给定下面的代码,判断输出值:
#include <stdio.h>
int i;
int main()
{
i--;
if (i > sizeof(i))
{
printf(">\n");
}
else
{
printf("<\n");
}
return 0;
}
答案是: >
这一题可能让很多人感觉惊讶,明明 i 的初始值默认为0,i–之后应该变成-1了呀。sizeof( i ) 求得的应该是 i 的字节数 应该是4 呀,难不成是sizeof( i )出了问题? 我们测试一下
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int i;
int main()
{
i--;
printf("sizeof(i) is %d\n",sizeof(i));
if (i > sizeof(i))
{
printf(">\n");
}
else
{
printf("<\n");
}
return 0;
}
结果如图:
我们会发现 sizeof的结果就是4,并没有出错。
那么到底是哪里出错了呢?
我们再回到sizeof上,当我们鼠标移动到sizeof关键字上面去,会发现这样一段描述:
这是编译器为我们解释了 sizeof( )这个函数 这时我们会发现:sizeof()函数的返回值类型不是 int 而是 unsigned int 那么unsigned int 和 int 有什么区别呢 ?
从名字我们可以看出,一个是无符号数整形 unsigned ; 一个是有符号数整形 signed int,但是我们通常习惯把signed 省略,剩下就是我们常见的 int 类型数据。 他们最大的区别就是有无符号位的区别: unsigned int 没有符号位,所以他的数据范围是2^32 -1。 int 类型的第一位二进制存储的是负数,所以他的数据范围是-2^31 ~ 2^31 -1。 而且我们要知道数据再计算机中是以补码的方式进行存储的
所以我们再回过头看这个题目 int 类型的数据和 unsigned int 类型数据进行比较时,编译器会自动将 int 类型的数据转化为unsigned int 类型的数据。 int 类型中 -1的补码是 11111111 11111111 11111111 11111110,转化成unsiged int 类型的数据,是一个非常大的数字,所以打印 > 。