微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决评估`int x = -2147483648`会发生什么?

评估时会发生什么

int x = -2147483648

  1. 在评估-2147483648时,2147483648一个整数类型,其long类型不是int,因此评估-2147483648的结果-2147483648是long类型,而不是int类型。

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

谢谢。

解决方法

您对这个问题的分析是正确的。由于该值在int的范围内,并且在初始化过程中会转换为int(请注意:赋值也会发生这种情况),所以一切都会按预期进行。

对于您没有问到的问题的隐藏部分,由于它会一直重复出现,因此这并不意味着您可以将INT_MIN定义为-2147483648。魔术在=中(作为赋值运算符或初始化构造中的令牌)。在未使用它的上下文中,具有-2147483648long类型而不是long 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的首位,因此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,648,因此它保持不变。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。