c语言打印int类型的下边界

x86平台int的取值范围是:-2147483648~2147483647,那么打印一下int类型的下界有没有问题呢?

 #include <stdio.h>
 
 int main(void)
 {
     printf("%d\n", -2147483648);
     return 0;
 }
# gcc -Wall -o e e.c
e.c: In function ‘main’:
e.c:5:5: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long int’ [-Wformat=]
     printf("%d\n", -2147483648);
     ^

编译器报了一个警告,期待的参数值类型是int,但却给了一个long int,再看下面这个代码:

 #include <stdio.h>
 
 int main(void)
 {
     printf("%d\n", -2147483647-1);
     return 0;
 }
# gcc -Wall -o e e.c
#  

编译通过? -2147483647-1 不就等于 -2147483648吗?

这是因为c编译器会把-2147483648看成由一个符号 - 和 2147483648组成的表达式,而2147483648已经超出了int类型的取值范围,我们知道32位平台,int,long都是4字节,那么它也超了long的取值范围,由于我电脑是64位系统,long型占8个字节,所以-2147483648没有超出long型。第二个代码 - ( <--这是减号)二元操作符左边是-2147483647右边是 1 都是int型,它们自己没有超出int型范围,计算结果也是int型,而它的值也没有超出int型范围,所以以%d打印,可以打印出来。

再说一下,通常的编译器实现遵守ILP32或LP64规范

类型            ILP32 (位数)        LP64 (位数)

char            8                        8

short          16                      16

int               32                      32

long            32                      64

long long    64                     64

指针            32                      64

ILP32意思是int(I)、long(L)、指针(P)类型都占32位,4个字节,通常32位计算机的C编译器采用这种规范,x86平台的gcc也是采用这种规范。LP64意思是long(L)、指针(P)占64位,通常64位计算机的C编译器采用这种规范,所以指针类型的长度总是和计算机的位数一致。





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值