为什么C++中int与unsigned int比较结果不符合预期?
C++有符号与无符号整数比较结果异常原因解析
核心原因是C++的寻常算术转换规则(整数隐式类型转换规则)导致的:
- 当表达式中同时出现
int(有符号整数)和unsigned int(无符号整数)类型的操作数时,编译器会自动将int类型的操作数隐式转换为unsigned int类型,再进行比较或运算。 - 你的代码中
x是值为-1的int类型,y是值为1的unsigned int类型,执行x > y比较前,x会先被转换为unsigned int类型。 - 主流32位系统中,
int类型的-1的二进制补码表示为0xFFFFFFFF,转换为unsigned int后对应的十进制值为4294967295,该值远大于1,因此比较结果为真,输出true。
开发过程中要尽量避免有符号、无符号整数直接比较,否则极易出现这类违反直觉的逻辑错误。可以开启编译器的
-Wsign-compare(GCC/Clang)或/w44018(MSVC)警告选项提前识别这类问题。
内容的提问来源于stack exchange,提问作者east1000
相关产品推荐
相关产品推荐

