C通常的算术转换 - 标准的最后一种情况

时间:2014-11-16 23:41:17

标签: c promotions

尝试解析标准,最后一种情况似乎是我们有一个有符号和一个无符号操作数的情况,其中带符号的操作数具有更大的等级,但仍然不能适应低等级的无符号操作数的整个范围秩。当我们在32位体系结构上有一个带符号的long和unsigned int时,似乎就是这种情况。标准说明如下:

  

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

如果我正确阅读,那么

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

会导致ab在添加前都转换为无符号长吗?它是否正确?我没有要测试的32位计算机,但这意味着a+b应该具有值ULONG_MAX?这可能是对的吗?

1 个答案:

答案 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