V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
winterma
V2EX  ›  问与答

关于 C++ 里面的 INT_MIN

  •  
  •   winterma · 2014-08-25 22:47:19 +08:00 · 5042 次点击
    这是一个创建于 3727 天前的主题,其中的信息可能已经有所发展或是发生改变。
    if (-2147483648 > 0) printf("positive\n");
    if (-2147483647 - 1 < 0) printf("negative\n");

    结果是两次if都为真。
    不明白的是第二次为什么会判断为真?-2147483647 - 1计算机是如何进行处理的?
    11 条回复    2014-08-27 15:00:01 +08:00
    skydiver
        1
    skydiver  
       2014-08-25 22:50:11 +08:00 via iPad
    反汇编一下看看
    nopy
        2
    nopy  
       2014-08-25 22:50:59 +08:00
    YouXia
        3
    YouXia  
       2014-08-26 02:09:05 +08:00
    内存里面补码表示,负数除符号位外,取反加1,而减1,其实是加负1(也是补码表示)。
    zwzmzd
        4
    zwzmzd  
       2014-08-26 09:39:47 +08:00
    http://blog.csdn.net/seizef/article/details/7605010
    和编译器语法分析的设计有关
    glogo
        5
    glogo  
       2014-08-26 09:42:01 +08:00
    LZ 可以看看《深入理解计算机操作系统》讲信息在计算机中表示的那一节,有讲到这个问题的~
    stackpop
        6
    stackpop  
       2014-08-26 09:51:17 +08:00
    4楼是正解.
    用clang编译, 楼主的两个if都是false
    第二个if, 有些编译器可能会认为和 if( -2147483647 < -1 )是等价的, 有些编译器可能会先做减法再做大小比较.亦或者和<所代表的位运算有关.
    Monad
        7
    Monad  
       2014-08-26 09:56:59 +08:00
    我想知道楼主用的啥编译器试出来的
    winterma
        8
    winterma  
    OP
       2014-08-26 14:43:59 +08:00
    @Monad 就是GCC啊
    winterma
        9
    winterma  
    OP
       2014-08-26 14:46:16 +08:00
    @stackpop -2147483647 - 1算出来的结果应该是100.....00(31个0), 也就是负零,不知道负零在计算机里面有什么含义吗?
    zwzmzd
        10
    zwzmzd  
       2014-08-26 19:14:49 +08:00
    @winterma 补码表示中零只有一种表示,那就是0x00000000(32位情况下),没有什么正零负零的区别。

    LZ可以用下面代码显示INT_MIN的十六进制表示:
    printf("0x%08x\n", INT_MIN);

    还有就是要注意的是,补码可表示的数字范围,负数会比正数多一个(正是因为零的存在)

    0x00000000 对应 0
    0x00000001~0x7fffffff 对应正数 1~2147483647
    0x80000000~0xffffffff 对应负数 -2147483648~-1(注意对应顺序,是反着的)

    按照上面的表将这些数字画到一个环上去,这个数环蕴含了正无穷和负无穷相接的思想


    你直接写-2147483648,gcc将其认为是一个表达式,即一个负号(-)和一个立即数(2147483648),而2147483648不是32位计算机中可以直接表示的数字(数环里没有这个数字),所以gcc在编译的时候会有warning出现,并且对于这个情况会采用一些默认处理,造成了意料之外的结果。
    winterma
        11
    winterma  
    OP
       2014-08-27 15:00:01 +08:00
    @zwzmzd 非常感谢你的解答,完全明白了! 我之前一直认为int可表示的正负数一样多,所以觉得0x80000000是多出来的东东... 再次感谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2710 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 14:34 · PVG 22:34 · LAX 06:34 · JFK 09:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.