C++中为何`-1 + unsigned(0)`的结果大于0?
为什么这段C++代码中
i > 0的结果为真? 先看这段代码:
#include <stdio.h> int main() { auto i = -1 + unsigned(0); printf("%d %d\n", i, i > 0); }
它的输出是-1 1,看似矛盾的原因在于类型转换规则和无符号数的特性:
i的实际类型和值
表达式-1 + unsigned(0)中,-1是有符号int,unsigned(0)是无符号unsigned int。根据C++的运算规则,当有符号数与无符号数混合运算时,有符号数会被转换为无符号数。
有符号的-1转换为unsigned int时,会按照无符号数的模运算规则处理(以32位系统为例):-1加上2^32得到0xFFFFFFFF,所以i的实际类型是unsigned int,值为0xFFFFFFFF。printf的格式化输出误导
第一个输出用%d(有符号int格式)打印i,0xFFFFFFFF作为有符号int的补码正好对应-1,所以输出-1,但这只是格式化显示的结果,i本身的类型和值并没有改变。i > 0的判定逻辑
因为i是unsigned int类型,无符号数的取值范围是0到2^32-1(32位系统),所有无符号数都大于等于0,0xFFFFFFFF显然大于0,所以判定结果为1(真)。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

