评估 `int x = -2147483648` 时会发生什么?
What happens when evaluating `int x = -2147483648`?
评估时会发生什么
int x = -2147483648
?
计算-2147483648
时,2147483648
是整型常量,long类型不是int,所以-2147483648
的计算结果-2147483648是long类型, 不是整数。
赋值“int x = ...”时,RHS为long类型的值-2147483648,在x
的类型[=15]范围内=].值-2147483648是否会从long隐式转换为int,并且转换保持值-2147483648不变?
谢谢。
你这道题的分析是对的。因为该值在 int
的范围内,并且在初始化过程中被转换为 int
(注意:赋值也会发生同样的情况),所以一切都按预期工作。
至于你没有问的问题的隐藏部分,因为它一直作为重复关闭,这并不意味着你可以将 INT_MIN
定义为 -2147483648
。神奇之处在于 =
(作为赋值运算符或初始化构造中的标记)。在不使用它的上下文中,-2147483648
具有类型 long
或 long long
而不是 int
的各种方式会破坏 INT_MIN
的语义要求。例如:
(INT_MIN < 0U) == 0
(因为两个操作数都提升为unsigned
),但是
(-2147483648 < 0U) == 1
(因为两个操作数都提升为long
或long long
)。
此答案假定 C 实现使用 32 位 int
和 64 位 long
。
C 2018 6.4.4.1 说“整数常量的类型是相应列表中可以表示其值的第一个。”在随后的 table 中,没有后缀的十进制常量条目包含列表 int
、long int
、long 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。
评估时会发生什么
int x = -2147483648
?
计算
-2147483648
时,2147483648
是整型常量,long类型不是int,所以-2147483648
的计算结果-2147483648是long类型, 不是整数。赋值“int x = ...”时,RHS为long类型的值-2147483648,在
x
的类型[=15]范围内=].值-2147483648是否会从long隐式转换为int,并且转换保持值-2147483648不变?
谢谢。
你这道题的分析是对的。因为该值在 int
的范围内,并且在初始化过程中被转换为 int
(注意:赋值也会发生同样的情况),所以一切都按预期工作。
至于你没有问的问题的隐藏部分,因为它一直作为重复关闭,这并不意味着你可以将 INT_MIN
定义为 -2147483648
。神奇之处在于 =
(作为赋值运算符或初始化构造中的标记)。在不使用它的上下文中,-2147483648
具有类型 long
或 long long
而不是 int
的各种方式会破坏 INT_MIN
的语义要求。例如:
(INT_MIN < 0U) == 0
(因为两个操作数都提升为unsigned
),但是(-2147483648 < 0U) == 1
(因为两个操作数都提升为long
或long long
)。
此答案假定 C 实现使用 32 位 int
和 64 位 long
。
C 2018 6.4.4.1 说“整数常量的类型是相应列表中可以表示其值的第一个。”在随后的 table 中,没有后缀的十进制常量条目包含列表 int
、long int
、long 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。