常量和常量表达式

问题出自于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\n");

    if(-2147483647 - 1 < 0)
        printf("negative\n");

    return 0;
}
gcc -std=c89 执行结果为positive        negative (c89 将2147483648当成 unsinged long int)
gcc -std=c99 执行结果为negative  (c99将2147483648当成long long int)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值