C中的数字的默认数据类型是什么?

时间:2016-06-03 05:27:51

标签: c overflow

在C中,

unsigned int size = 1024*1024*1024*2;

导致警告“表达式中的整数溢出...” 而

unsigned int size = 2147483648;

结果没有警告?

第一个表达式的正确值是否默认为int?它在C99规范中提到了什么?

2 个答案:

答案 0 :(得分:11)

当使用没有任何后缀的十进制常量时,十进制常量的类型是第一个可以按顺序表示的(当前C标准,6.4.4常量p5):

  • INT
  • long int
  • long long int

第一个表达式的类型是int,因为值为1024和2的每个常量都可以表示为int。这些常量的计算将在int类型中完成,结果将溢出。

假设INT_MAX等于2147483647且LONG_MAX大于2147483647,则第二个表达式的类型为long int,因为此值不能表示为int,但可以表示为long int。如果INT_MAX等于LONG_MAX等于2147483647,则类型为long long int

答案 1 :(得分:3)

unsigned int size = 1024*1024*1024*2;

此表达式1024*1024*1024*2(在表达式10242中的类型为signed int)生成类型为signed int的结果,此值也是大signed int。因此,您会收到警告。

在有符号的乘法之后,它被分配给unsigned int