给出代码:请问打印 ">" 还是 "<"?
int i;
int main()
{
i--;
if (i > sizeof(i))
{
printf(">\n");
}
else
{
printf("<\n");
}
return 0;
}
想要解决这个问题,我们需要理解
1、全局变量,静态变量(static)都是放在静态区,不初始化的时候,默认被初始化为0.
2、局部变量,是放在栈区,不初始化,默认是随机值
3、sizeof这个操作符计算返回的结果是size_t类型的,是无符号整型的
那么对于if(i > sizeof(i)) // -1 > 4
-1是负数即int类型,而 这里的4是unsigned int类型,这里就发生了算数转换
10000000000000000000000000000001(-1的原码)
1111111111111111111111111111111111111(-1的补码)
也就是说-1(int类型)算数转换成了4,294,967,295(unsigned类型)
4,294,967,295显然大于 4
4、整型提升和算数转换
这里对C语言的常见类型以 int类型 为分界线,字节数小于int类型的转化成int类型,称为整型提升
而int类型向上(字节数更大)转化成其它类型,称为算数转换。
关于整型提升和算数转换,感兴趣的小伙伴可以点这里。
关于本章开头的代码问题详解,感兴趣的小伙伴可以点这里。(在59分钟)