printf("%d", -1<0u); 这个输出什么呀, 0或1?

                                         printf("%d", -1<0u); 这个输出什么呀, 0或1?

                                                            周银辉 

 

既然我这么问了, 那么答案自然不是1,而是0
看看下面的代码:
 

对于-1+0u输出为-1,似乎理所当然,但为什么-1<0u却输出0呢,也就是说-1不小于0u,好神奇啊

一个解释是:“当执行一个运算时, 如果它的一个运算数是有符号的而另一个是无符号的,那么C会隐含地将有符号参数强制类型转换为无符号数,并假设这两个数都是非负的,来执行这个运算” (来自《深入理解计算机系统(修订版)49页》),-1的有符号表示为1111....1111(N个1,N取决于位宽,我们假设32个吧),如果强制解释为无符号数,那么就是2^32: 4294967296 ,当然比0大咯,所以输出0(false)
当,我晕,在执行-1+0u运算时,C似乎又不愿意采用这种方式了,而是(我猜的)将0u采用“零扩展”的方式向上转型为有符号数的0,那么-1+0,就自然得到-1了

这两种解释似乎是矛盾的, 我很奇怪在运算-1<0u时为啥不用“零扩展”向上转型,而输出1呢,我们也希望得到1,对吧~

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值