繁体   English   中英

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

[英]What happens when evaluating `int x = -2147483648`?

评估时会发生什么

int x = -2147483648

?

  1. 在计算-21474836482147483648是一个 long 类型不是 int 的整数常量,因此计算 -2147483648 的结果-2147483648是 long 类型,而不是 int 类型。

  2. 在评估赋值“int x = ...”时,RHS 是 long 类型的值 -2147483648,它在x的类型int的范围内。 值 -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 说“整数常量的类型是可以表示其值的相应列表中的第一个。” 在下表中,没有后缀的十进制常量条目包含列表intlong intlong long int 由于long int是第一个可以表示 2,147,483,648 的long int ,因此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值。

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

因此, int x = -2147483648; x用值 -2,147,483,648 初始化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM