6
将2个字节转换为带符号的16位整数的正确方法是什么?
在这个答案中,zwol宣称: 从外部源将两个字节的数据转换为16位带符号整数的正确方法是使用如下辅助函数: #include <stdint.h> int16_t be16_to_cpu_signed(const uint8_t data[static 2]) { uint32_t val = (((uint32_t)data[0]) << 8) | (((uint32_t)data[1]) << 0); return ((int32_t) val) - 0x10000u; } int16_t le16_to_cpu_signed(const uint8_t data[static 2]) { uint32_t val = (((uint32_t)data[0]) << 0) | (((uint32_t)data[1]) << 8); return ((int32_t) val) - 0x10000u; } 上面的哪个函数合适,取决于数组包含小端还是大端表示。字节序不是这里要讨论的问题,我想知道为什么zwol0x10000u从uint32_t转换为的值中减去int32_t。 为什么这是正确的方法? …