评估 `int x = -2147483648` 时会发生什么?

What happens when evaluating `int x = -2147483648`?

评估时会发生什么

int x = -2147483648

?

  1. 计算-2147483648时,2147483648是整型常量,long类型不是int,所以-2147483648的计算结果-2147483648是long类型, 不是整数。

  2. 赋值“int x = ...”时,RHS为long类型的值-2147483648,在x的类型[=15]范围内=].值-2147483648是否会从long隐式转换为int,并且转换保持值-2147483648不变?

谢谢。

你这道题的分析是对的。因为该值在 int 的范围内,并且在初始化过程中被转换为 int(注意:赋值也会发生同样的情况),所以一切都按预期工作。

至于你没有问的问题的隐藏部分,因为它一直作为重复关闭,这并不意味着你可以将 INT_MIN 定义为 -2147483648。神奇之处在于 =(作为赋值运算符或初始化构造中的标记)。在不使用它的上下文中,-2147483648 具有类型 longlong long 而不是 int 的各种方式会破坏 INT_MIN 的语义要求。例如:

  • (INT_MIN < 0U) == 0(因为两个操作数都提升为unsigned),但是
  • (-2147483648 < 0U) == 1(因为两个操作数都提升为longlong long)。

此答案假定 C 实现使用 32 位 int 和 64 位 long

C 2018 6.4.4.1 说“整数常量的类型是相应列表中可以表示其值的第一个。”在随后的 table 中,没有后缀的十进制常量条目包含列表 intlong intlong long int。因为 long int 是第一个可以表示 2,147,483,648 的,所以 2147483648 的类型是 long int.

根据 6.5.3.3 3,- 的结果是提升的类型。整数提升 (6.3.1.1 2) 对 long int 没有影响。所以 -2147483648 的类型是 long int.

根据 6.7.9 11,初始化器的值按照简单赋值进行转换。根据 6.5.16.1 2 和 6.5.16 3,值被转换为左值转换后被分配对象的类型。也就是说,对于 int 对象的赋值,类型是 int 值。

Per 6.3.1.3 1,将整数类型的值转换为另一种整数类型时,如果新类型可以表示该值,则不变。由于int可以表示-2,147,483,648,所以不变。

因此,int x = -2147483648;的结果是x初始化为值-2,147,483,648。