如何解决评估`int x = -2147483648`会发生什么?
评估时会发生什么
int x = -2147483648
?
-
在评估
-2147483648
时,2147483648
是一个整数类型,其long类型不是int,因此评估-2147483648
的结果-2147483648是long类型,而不是int类型。 -
在评估赋值“ int x = ...”时,RHS是long类型的值-2147483648,该值在
x
类型的int
范围内。值-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说:“整数常量的类型是相应列表中可以表示其值的列表中的第一个。”在下面的表中,不带后缀的十进制常数条目包含列表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
值。
根据6.3.1.3 1,将整数类型的值转换为另一整数类型时,如果新类型可以表示该值,则该值不变。由于int
可以表示−2,648,因此它保持不变。
因此,int x = -2147483648;
的结果是x
被初始化为值−2,648。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。