2014-09-02 19 views
2

閱讀頗有幾個整數促銷問題後,它似乎是整型的提升,或只適用於小的整數類型,如short intchar共識。爲什麼無符號整數變量通常不受整數提升的影響?

不過,我不知道爲什麼我的unsigned int變量。即價值15也不應該升級到int。畢竟,它的轉換等級等於int和unsigned int的等級,如以下引文中的語句(1)所要求的。

作爲int可以代表價值15沒有任何問題(我知道所有plattforms),它應該被轉換爲一個int。

Integer promotions

以下可以在表達式中使用的任何地方可使用int或unsigned INT:

  1. 的物體或表達的整數類型,其整數轉換秩爲小於或等於 int和unsigned int的等級。

  2. 類型爲_Bool,int,signed int或unsigned int的位域。

如果int可以表示原始類型(如由寬度限制 ,對於一個位字段)的所有值,該值被轉換爲int; 否則,它被轉換爲一個unsigned int。這些被稱爲 整數促銷。所有其他類型均以整數 促銷活動不變。

+0

With'unsigned a = 1;長長的b = 2; b = a + b;','a'在加法之前被提升爲'long long'。 – chux 2014-09-02 20:10:56

+0

我不清楚你在問什麼,你在問一個基本原理,還是你問爲什麼措辭不允許? – 2014-09-02 20:12:52

+0

可能依賴於你的問題真的是相關的:[在C和C++的算術運算之前爲什麼必須將一個短轉換爲int?](http://stackoverflow.com/questions/2437186​​8/why-musta-a- short-be-convert-an-int-before-arithmetic-operations-in-c-and-c) – 2014-09-02 20:15:19

回答

8

但是,我想知道爲什麼一個無符號的int變量我。即值15不應該被提升到一個int爲好。 [...]的int可以代表沒有任何問題的價值15

有兩個問題有這樣的說法:

  • 整數促銷確實平均「提升爲int」;這意味着「促銷intunsigned int」。因此,「推廣」一個unsigned int沒有意義:它已經被提升。
  • 整數提升規則不考慮表達式的當前值。規則是專門寫一種方式來談論所有值類型。因此,int能夠表示值15的事實是不相關的,因爲int不能表示unsigned int的所有值。
+0

我還不確定我是否應該將此標記爲接受的答案。雖然第二條款在我所知的所有平臺上都是肯定的,但第一條款還不令我滿意。 我跟你說,「推廣」一個'unsigned int'沒有意義。然而,我發佈這個問題的原因是:爲什麼將'unsigned int'提升爲'int' legaly允許的,儘管它沒有意義?畢竟,標準說:_整數轉換等級小於**或等於**的等級和無符號整型! 我希望你明白我的觀點。我不是母語,這是一個相當複雜的話題。 – Multisync 2014-09-04 19:18:37

+0

@Multisync「爲什麼在法律允許的情況下將'unsigned int'提升爲'int'雖然沒有意義?它在法律上是不允許的:規則說:「如果一個int可以表示原始類型的所有值**,則該值將被轉換爲一個」int「。由於'int'可以代表* unsigned int的* some *,而不是* all *的值,所以不考慮這種升級,儘管類型具有相同的轉換等級(實際上,所有相應的'X'(帶符號)和'無符號X'類型總是具有相同的轉換等級)。 – dasblinkenlight 2014-09-04 19:40:53

+0

嗯..好的。不過我不明白他們爲什麼要在那裏放置「_or equal_」。如果我對等級模式的理解是正確的,那麼不能有等級爲'unsigned int'或者'int'的等級,所以把它放在那裏沒有任何意義。 – Multisync 2014-09-04 20:28:04

3

通常,在編譯時不可能說變量在升級實際發生時會保持什麼值。

調查變量的值以在運行時選擇適當的類型會引入太多的開銷,以及根本不可能。所以,只有編譯器具有類型。

我認爲首選無符號類型而不是簽名的原因是定義了無符號整數溢出,而有符號整數的溢出是未定義的行爲。

相關問題