当一个算术表达式中既有无符号数又有有符号数值时,有符号数的值就会转换成无符号数。
例如:unsigned u = 10;
int i = -42;
cout<<i + i<<endl;//输出-84
cout<<u + i<<endl;//如果int占32位输出4294967264
在第一个输出表达式里,两个负整数相加并得到了期望的结果。
在第二个输出表达式里,相加前首先把整数-42转换成无符号数。把负数转
换成无符号数类似与直接给无符号数赋一个负值,结果等于这个负数加上无
符号数的模。
所以转换后的无符号i的值为(-42)+2^32 = 4294967254
所以最终 u + i = 4294967254 + 10 = 4294967264
(注:有符号向无符号转换的结果应当视当前机器上的int所占位数而定。)
当从无符号数中减去一个值时,不管这个值是不是无符号数,我们都必须确保结果不能是一个负值。
例如:unsigned u1 = 42,u2=10;
cout<< u1 - u2<< endl;//正确:输出32
cout<< u2 - u1<< endl;//正确:不过,结果是取模后的值
结果u2-u1 = (10-42)+2^32 = 4294967264
提示:切勿混用带符号类型和无符号类型进行运算。
如果表达式里既有 带符号类型又有无符号类型,当带符号类型取值为负数时 会出现异常结果,这是以你为带符号数 自动转换成无符号数。
在for循环中可能造成死循环:
for(unsigned i = 10;i>=0;--i)
cout<<i<<endl;
此for循环为死循环,因为变量i永远不会小于0,循环条件一直成立。
当i=0时,继续执行for语句表达式,--i后,i=-1并不满足无符号数的要i=0 时,--i的结果为4294967295
含有无符号类型的表达式计算
最新推荐文章于 2022-12-11 23:11:31 发布