C++中逻辑等价的比较运算返回不同bool值是什么原因?
问题根因:C/C++无符号整数隐式转换规则
- 首先明确类型规则:
size_t是C++标准定义的无符号整数类型,你代码里的node->size、变量size、sizeof运算符的返回值全部是size_t类型。 - 计算
node->size - size - sizeof(MallocMetadata)时,所有操作数都是无符号整数,运算过程不会自动转换为有符号类型,最终表达式的返回值也是size_t类型:你看到的-48本质是无符号整数溢出回绕后的超大正数值,远大于128,所以直接做< 128比较时结果为false,对应test变量的取值。 - 你把运算结果赋值给
int类型的tmp_res时,无符号的超大值被强制转换为有符号int,还原出了-48的结果,此时有符号数和128比较的结果符合预期,对应test1变量的取值。
如果要避免这类问题,运算前先把无符号值强制转换为范围足够的有符号类型即可,示例修复代码:
bool test = (static_cast<long long>(node->size) - static_cast<long long>(size) - static_cast<long long>(sizeof(MallocMetadata))) < 128;
内容的提问来源于stack exchange,提问作者user16310948
相关产品推荐
相关产品推荐

