2015-06-21 149 views
14
#include<stdio.h> 

int main() 
{ 
    printf("%d\n", sizeof(2147483648)); 
    printf("%d" , sizeof(2147483647+1)); 
    return 0; 
} 

输出:的sizeof(2147483648)是8个字节,而的sizeof(2147483647 + 1)为4个字节

8 
4 

我明白sizeof(2147483648)是因为它可以不适合在4个字节的8个字节,并提升为long long int。但我不明白会发生什么情况sizeof(2147483647+1)

我发现similar question但它没有讨论第二种情况。

+3

你为什么要这么做首先 –

+0

可能的重复[为什么是“int i = 2147483647 + 1;”好的,但是“字节b = 127 + 1;”是不是compilable?](http://stackoverflow.com/questions/6889176/why-is-int-i-2147483647-1-ok-but-byte-b-127-1-is-not-compilable) – GSerg

+10

' 2147483647 + 1'是一个表达式,它具有两个“int”操作数,所以结果是一个“int”(并且由于溢出而具有未定义的行为)。同样,'-2147483648'是一个表达式,其中'2147483648'是一个'long int',然后将一元减算子应用于它, –

回答

18

用C整数常数的规则是,一个十进制整数常数具有其中它可以被表示在第一类型:intlonglong long

2147483648 

不适合放入一个int到系统(如系统中的最大int2147483647),所以它的类型是long(或取决于系统上的long long)。所以你计算sizeof (long)(或sizeof (long long)取决于你的系统)。

2147483647 

是在你的系统中int,如果你添加1int它仍然是一个int。所以你计算sizeof (int)

注意sizeof(2147483647+1)在你的系统调用未定义行为INT_MAX + 1溢出,并签署整数溢出是C.不确定的行为

注意的是,虽然一般2147483647+1调用系统中的未定义行为(INT_MAX + 1溢出并签署整数溢出在C中是未定义的行为),sizeof(2147483647+1)不会调用未定义的行为,因为在这种情况下操作数sizeof未被评估。

+2

您确定这里有未定义的行为,因为该表达式作为'sizeof'的参数出现,而不是在它将被评估的上下文中? – Hurkyl

+3

我怀疑它会调用UB。 '2147483647 + 1'不会被评估。 – haccks

+1

可能相关:[不评估应用sizeof的表达式是否可以在C++中取消引用sizeof中的空指针或无效指针是合法的?](http://stackoverflow.com/q/28714018/11683)。 – GSerg

相关问题