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 的行为标准还是其他未定义的行为?
这与整数提升无关,而是与类型转换有关。在您的情况下,该过程由C11 标准定义- 6.3.1.3 Signed and unsigned integers (p2):
.. 如果新类型是无符号的,则通过重复加或减一个新类型可以表示的最大值来转换该值,直到该值在新类型的范围内。
所以在这里0xFF80 = 0xFFFF + (-128) + 1,0xFFFF可以表示的最大值是uint16_t.