C Cast 上的整数提升如何工作?

Neo*_*Man 3 c types casting sign undefined-behavior

我被一个意想不到的整数提升所困扰,让我感到奇怪。在显式转换之前是否进行提升是否在编译器之间保持一致?

让我解释。有一个有符号的 8 位变量,例如

int8_t s8a = -128; //<-- 0x80

分配到一个无符号16uint16_t s16b = s8a + 1;我希望晋升到一个更大的整数0xFF81,然后分配,这是一种常见的事故,并像MISRA C.文件,但明确地铸造为无符号类型的方式考虑像uint16_t s16b = (uint16_t)s8a我本来预计s8a给立刻输它的“符号性”,然后零扩展到 16 位作为给予,0x0080但实际上相反的情况发生,因为它得到符号扩展然后在转换和分配给予时失去其符号性0xFF80

这是 C 的行为标准还是其他未定义的行为?

Eug*_*Sh. 5

这与整数提升无关,而是与类型转换有关。在您的情况下,该过程由C11 标准定义- 6.3.1.3 Signed and unsigned integers (p2)

.. 如果新类型是无符号的,则通过重复加或减一个新类型可以表示的最大值来转换该值,直到该值在新类型的范围内。

所以在这里0xFF80 = 0xFFFF + (-128) + 10xFFFF可以表示的最大值是uint16_t.