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

14

在 C 语言中,

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

该操作会导致一个警告:"表达式中的整数溢出..."。同时,

unsigned int size = 2147483648;

结果没有警告吗?

第一个表达式的正确值是否默认为int?C99规范在哪里提到了这一点?


1
你确定第二个值不是2147483648吗? - abhishek_naik
您可能指的是值2147483648。我的答案是基于此假设的。 - 2501
已经修复了!谢谢! - mingpepe
问题的根源在于没有意识到整数常量也有类型,就像命名变量一样。 - Lundin
2个回答

18

在没有任何后缀的十进制常量中,其类型为可以表示的第一个类型(根据当前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
除非INT_MAX == LONG_MAX,否则第二个表达式可能是long long int类型。请注意,Win64是一个64位环境,在这里INT_MAX == LONG_MAX;大多数32位环境都以INT_MAX == LONG_MAX运行。 - Jonathan Leffler
@JonathanLeffler 谢谢。是的,那些是常见的限制,我应该记住的。 - 2501

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

这个表达式 1024*1024*1024*2(在表达式中,10242 的类型为 signed int)产生的结果是 signed int 类型的,而这个值对于 signed int 来说太大了。因此,你会收到警告。
之后,它被赋给了 unsigned int

我知道这个值对于有符号整数来说已经溢出了。但为什么它是有符号整数? - mingpepe
1
@mingpepe 因为默认情况下 10242 是有符号整数,所以乘法结果也是 signed int 类型,然后在分配给 unsigned int 时更改了类型。 - ameyCU
产品1024*1024*1024*2溢出,而int溢出是UB。最好使用1024u*1024*1024*2 - chux - Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接