首页 文章

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

提问于
浏览
3

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

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

如果我正确地读了这个,那么

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

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

1 回答

  • 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
    

相关问题