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

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

 #include 
 
 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 
 
 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编译器采用这种规范,所以指针类型的长度总是和计算机的位数一致。





你可能感兴趣的:(c语言打印int类型的下边界)