含有无符号类型的表达式计算

当一个算术表达式中既有无符号数又有有符号数值时,有符号数的值就会转换成无符号数。

例如: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   

数据类型转换关系由低到高

数据类型转换图

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值