尝试解析标准,最后一种情况似乎是我们有一个有符号和一个无符号操作数的情况,其中带符号的操作数具有更大的等级,但仍然不能适应低等级的无符号操作数的整个范围秩。当我们在32位体系结构上有一个带符号的long和unsigned int时,似乎就是这种情况。标准说明如下:
否则,两个操作数都将转换为无符号整数类型,对应于带有符号整数类型的操作数类型。
如果我正确阅读,那么
long a = -3;
unsigned int b = 2;
a + b;
会导致a
和b
在添加前都转换为无符号长吗?它是否正确?我没有要测试的32位计算机,但这意味着a+b
应该具有值ULONG_MAX
?这可能是对的吗?
答案 0 :(得分:3)
这正是您的想法,根据引用的规则,两个操作数都被提升为unsigned long
类型,请参阅live example(ideone显然是32位):
#include <stdio.h>
#include <limits.h>
int main(void)
{
printf("%zu\n", sizeof(int));
printf("%zu\n", sizeof(long));
long a = -3;
unsigned int b = 2;
printf("%lu\n", a + b);
printf("%lu\n", -1UL);
printf("%lu\n", ULONG_MAX);
return 0;
}
结果:
4
4
4294967295
4294967295
4294967295