uint8_t与int8_t比较返回false的原因问询
问题描述
以下C代码在x86-64 gcc 12.2(C14标准)环境中运行,输出为less:
using namespace std; int main() { uint8_t b = 150; int8_t a = -10; if (a>b){ cout << "greater" << endl; } else{ cout << "less" << endl; } return 0; }
提问者认为比较a>b等价于-10 > -106(将uint8_t的150视为int8_t的-106),应该返回true输出"greater",但实际结果相反,询问原因。
原因分析
问题出在整数提升的规则上,而非直接的有符号/无符号同秩转换:
- 在x86-64平台上,
int类型是32位,而int8_t、uint8_t都是8位的窄整数类型。根据C++的整数提升规则,所有窄于int的整数类型在参与算术运算或比较时,会先被提升为int类型(因为int可以容纳这些窄类型的所有可能值)。 - 具体到代码中:
int8_t a = -10提升为int后,值仍为-10(-10在32位int的取值范围内)。uint8_t b = 150提升为int后,值为150(150是uint8_t的合法值,且远小于32位int的最大值)。
- 最终比较的是
int类型的-10 > 150,显然这个表达式的结果是false,因此代码输出less。
提问者的误区是忽略了整数提升的优先级,错误地直接将uint8_t的150转换为int8_t的-106来比较,但实际上在比较前,两个操作数已经被提升到了更宽的int类型,不存在无符号到有符号的截断转换。
内容的提问来源于stack exchange,提问作者podmivan
相关产品推荐
相关产品推荐

