先说结论:

当有符号数与无符号数做运算时,有符号数会隐性地变成无符号数

深入探讨一:

我们都知道,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的定义去寻找答案:

【无符号数】与【有符号数】运算问题_有符号数_02

通过查看定义,我们可以知道,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;
}

运行结果:

【无符号数】与【有符号数】运算问题_有符号数_03

既然刚刚才说,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

以上就是里面发生的一切