3

尝试解析标准,最后一种情况似乎是我们有一个有符号操作数和一个无符号操作数的情况,其中有符号操作数具有较大的秩,但仍然不能适应较低秩的无符号操作数的全部范围。当我们在 32 位架构上有一个有符号的 long 和一个无符号的 int 时,似乎就是这种情况。该标准规定如下:

否则,两个操作数都转换为与带符号整数类型的操作数类型对应的无符号整数类型。

如果我没看错,那么

long a = -3;
unsigned int b = 2;
a + b;

会导致ab都在加法之前很久就转换为无符号数?这个对吗?我没有要测试的 32 位机器,但这意味着它a+b应该具有价值ULONG_MAX?这可能是对的吗?

4

1 回答 1

3

这正是您所想的,两个操作数都unsigned long根据引用的规则被提升为类型,请参见实时示例(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
于 2014-11-16T23:47:59.920 回答