簡體   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