计算 `int x = -2147483648` 时会发生什么?

问题描述 投票:0回答:2

评估时会发生什么

int x = -2147483648

  1. 计算

    -2147483648
    时,
    2147483648
    是一个整数常量,其类型为long而不是int,因此计算
    -2147483648
    的结果-2147483648是long类型,而不是int类型。

  2. 在计算赋值“int x = ...”时,RHS 为 long 类型的值 -2147483648,该值在

    x
    的类型
    int
    的范围内。值-2147483648是否会从long隐式转换为int,并且转换后保持值-2147483648不变?

c type-conversion integer
2个回答
2
投票

您对这个问题的分析是正确的。因为该值在

int
的范围内,并且作为初始化的一部分转换为
int
(注意:赋值也会发生同样的情况),所以一切都按预期进行。

至于你没有问的问题的隐藏部分,因为它一直作为重复项被关闭,这并不意味着你可以将

INT_MIN
定义为
-2147483648
。神奇之处在于
=
(作为赋值运算符或初始化构造中的标记)。在不使用它的上下文中,具有类型
-2147483648
long
而不是
long long
int
有多种方式破坏了
INT_MIN
的语义要求。例如:

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

1
投票

此答案假定 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,147,483,648,因此它不变。

因此,

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

© www.soinside.com 2019 - 2024. All rights reserved.