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

  • 相关阅读:
    【转】ArcGIS 合并要素 Union Dissolve Append Merge
    Linux命令行下编辑常用快捷键
    rpm aid用法
    SUSE 吉祥物图片
    F9初装体验
    openSUSE10、SUSE EVAL10和SUSE10的区别[翻译]
    装有Linux DIY牛人百元人民币昂贵甜头液晶一体机
    SUSE10.3恢复GRUB体例
    64位Fedora还挑CPU
    Ubuntu8.04安置XCrysDen
  • 原文地址:https://www.cnblogs.com/zhouyinhui/p/1759396.html
Copyright © 2020-2023  润新知