先说结论:
当有符号数与无符号数做运算时,有符号数会隐性地变成无符号数
深入探讨一:
我们都知道,sizeof(i)的值是4。
但观察下面一段代码,我们会发现,sizeof(i)居然小于-1。这期间发生了什么呢?
#include <stdio.h>
int main()
{
int i = -1;
if (i > sizeof(i))
printf("i大\n");
else
printf("sizeof(i)大\n");
return 0;
}
运行结果:
我们转去sizeof的定义去寻找答案:
通过查看定义,我们可以知道,sizeof的返回值是size_t,也就是无符号整型。
而当有符号数与无符号数做运算时,有符号数会隐性地变成无符号数。
-1的补码为1111111111111111111111111111111
当-1被当作无符号数时,它的补码就是原码,此时它是一个很大的数(无符号int类型中可容纳的最大数)
所以-1 > sizeof(i)
深入探讨二:
另外,我们再来研究一段代码:
#include <stdio.h>
int main()
{
int ret = 0;
int i = -1;
ret = i + sizeof(i);
printf("%\n", ret);
return 0;
}
运行结果:
既然刚刚才说,sizeof与-1做运算时,-1是一个超级大的数,那为什么现在的结果却是3呢?
这是因为int类型的最大容量就是无符号的-1,此时再+1, -1就变成0了。而此时+了4,所以结果是3.
现在我们看看里面到底发生了什么:
-1的补码 11111111 11111111 11111111 11111111
sizeof(i)的补码 00000000 00000000 00000000 00000100
相加得 10 00000000 00000000 00000000 00000011
又因为它们是int类型的,最高只能容纳4个字节,所以会发生高位截断。
最终得 00000000 00000000 00000000 00000011
也就是十进制的 3
以上就是里面发生的一切