• 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,对吧~

  • 相关阅读:
    <img>标签
    <a>标签
    HTML标签类型
    HTML实体
    HTML颜色的三种写法
    HTML绝对路径和相对路径
    HTML基本结构及标签样式
    Java Activiti 工作流引擎 springmvc SSM 流程审批 后台框架源码
    java ssm 后台框架平台 项目源码 websocket IM quartz springmvc
    分批插入数据基于mybatis
  • 原文地址:https://www.cnblogs.com/zhouyinhui/p/1759396.html
Copyright © 2020-2023  润新知