uint8_t与取反后uint8_t相等性测试不符合预期的原因
uint8_t取反后比较不相等的原因解析
这是C语言整数提升规则导致的,具体过程如下:
uint8_t属于窄整数类型,当参与~这类运算符运算时,会先被提升为int类型(多数系统中int是32位)。- 你的
num2是uint8_t类型的255(二进制0b11111111),提升为int后变成0x000000FF。 - 对这个int值取反,得到
0xFFFFFF00(十进制-256),这是一个32位的int值。 - 而
num1是uint8_t类型的0,在和取反结果比较时,同样会被提升为int类型的0x00000000。 - 此时比较的是
0和0xFFFFFF00,两者显然不相等,所以程序输出0。
解决方法
要得到预期的比较结果,需要把取反后的结果强制转换回uint8_t,截断高位的无效值:
#include <stdio.h> #include <stdint.h> int main(int argc, char ** argv) { uint8_t num1 = 0; uint8_t num2 = 255; printf("%d\n", num1 == (uint8_t)~num2); return 0; }
这段代码会输出1,符合逻辑预期。
内容的提问来源于stack exchange,提问作者9a3eedi
相关产品推荐
相关产品推荐

