zoukankan      html  css  js  c++  java
  • 常量和常量表达式

    问题出自于CSAPP:p_105的Web Aside DATA:TMIN

    #define INT_MAX 2147483647
    #define INT_MIN (-INT_MAX - 1)

    文中提出了“为什么INT_MIN 没有直接宏定义为-2147483648 ?"的疑问,但是没有解答。

    查了下,发现教材中又有一处错了。

    关于整型常量的定义:

        “An integer constant begins with a digit, but has no period or exponent 
         part. It may have a prefix that specifies its base and a suffix that
         specifies its type.”

    定义中没有提到符号,因此:25是整型常量,-25是整型常量表达式;

    -2147483648是由一个一元减号运算符和一个整型常量2147483648构成的整型常量表达式。

    一个没有后缀的整型常量按下面顺序进行匹配
    C89     :     int, long int, unsigned long int
    C99     :     int, long int, long long int
    C++     :     int, long int, long long int

    对于C89,由于2147483648不能为int或long int所标示,因此就变成了unsigned long int型,即使加上一元减号运算符还是unsigned long int型,根本就就没有32位机下有符号的整型变量最小值。
    所以将INT_MIN宏定义为(-2147483647-1)

    #include <stdio.h>                                                                                                 
    
    int main(void)
    {
        if(-2147483648 > 0)
            printf("positive
    ");
    
        if(-2147483647 - 1 < 0)
            printf("negative
    ");
    
        return 0;
    }
    gcc -std=c89 执行结果为positive        negative (c89 将2147483648当成 unsinged long int)
    gcc -std=c99 执行结果为negative  (c99将2147483648当成long long int)
  • 相关阅读:
    [FJOI 2016] 神秘数
    [SHOI 2017] 寿司餐厅
    [HAOI 2012] Road
    [HAOI 2012] 容易题
    [TJOI 2018] XOR
    [NOI 2011] 阿狸的打字机
    [ZJOI 2010] 排列计数
    [TJOI2016 & HEOI2016] 字符串
    [HNOI 2011] 数学作业
    【NTT】loj#6261. 一个人的高三楼
  • 原文地址:https://www.cnblogs.com/openix/p/3186417.html
Copyright © 2011-2022 走看看