请看以下代码:
结果是“0xffffffff00000002”。这正是我所期望的。
#include <stdlib.h>
#include <stdio.h>
int main()
{
unsigned int a = 1;
unsigned int b = -1;
printf("0x%X\n", (a-b));
return 0;
}
结果为0x2。
我认为整数提升不应该发生,因为"a"和"b"的类型都是unsigned int。但是结果却让我感到困惑... 我不知道原因。
顺便说一下,我知道算术结果应该是2,因为1-(-1)=2。但是b的类型是unsigned int。当将(-1)赋给b时,实际上b的值是0xFFFFFFFF。这是unsigned int的最大值。当小的unsigned值减去一个大的值时,结果并不如我所期望。
从下面的答案中,我认为溢出可能是一个很好的解释。现在我写了其他测试代码,证明溢出答案是正确的。
#include <stdlib.h>
#include <stdio.h>
int main()
{
unsigned int c = 1;
unsigned int d = -1;
printf("0x%llx\n", (unsigned long long)c-(unsigned long long)d);
return 0;
}
结果是“0xffffffff00000002”。这正是我所期望的。