[英]What happens when evaluating `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 的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.