2013-03-29 73 views
4

根據來自C99標準以下兩項條文:理論上實現是否可以將unsigned int提升爲int?

6.2.5-9

帶符號的整數類型的非負的值的範圍是相應的無符號整數類型的子範圍 ,並且 的表示在每種類型中相同的值是相同的。

6.2.6.2-2

對於有符號的整數類型,所述對象的表示的比特必須 可以分爲三組:值的比特,填充比特,和符號比特 。不需要任何填充位;應該只有一個 符號位。每一位是一個值位,其值應與對應的 無符號類型的對象表示中的相同位的值相同(如果在有符號類型中有M個值位,而在無符號類型中有N個,則M≤N )。

它可能(可能)有符號類型表示可由相應的無符號類型表示的所有數字。例如,如果unsigned int類型使用31個值位和1個填充位表示,並且帶符號的整數使用31個值位並且沒有填充位表示。

是否允許這樣做的實現?如果是,那麼這是否意味着在這種情況下unsigned int將被升級爲int(因爲這兩種類型具有相同的轉換等級並且int可以表示unsigned int表示的所有值)?

+1

你不能得到一個夸脫成品脫瓶 - 這是一個成語,但是是真的 –

回答

4

它可能(可能)有符號類型表示所有可用相應的無符號類型表示的數字。例如,如果使用31個值位和1個填充位表示無符號整數類型,並且使用31個值位和無填充位表示帶符號整數。是否允許這樣做?

該標準建立在6.3.1.8 Usual arithmetic conversions

否則,整數優惠是在兩個操作數執行。然後將 以下規則應用於提升的操作數: 如果兩個操作數具有相同類型,則不需要進一步轉換。否則,如果兩個操作數具有有符號整數類型或兩者都具有無符號整數類型 ,則類型爲較小整數轉換等級的操作數爲 轉換爲具有較高等級的操作數的類型。

否則,如果具有無符號整數類型的操作數的秩大於或 等於另一個操作數的類型的秩,然後用 符號整型操作數被轉換爲操作數的類型與無符號 整數類型。

由於intunsigned int是相同等級(6.3.1.1 Boolean, characters, and integers),int將轉換成unsigned int,而不是周圍的其他方式:

- 任何無符號整型的等級應等於排名相應的 有符號整數類型,如果有的話。

後綴爲u的整數常量始終未經簽名(請參閱6.4.4.1 Integer constants中的表)。

6.3.1.1 Boolean, characters, and integers子句2還告訴我們:

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

- 一個對象或表達的整數類型,其整數轉換等級比int和unsigned int的等級小 。

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

如果int可以表示原始類型的所有值,則將該值轉換爲int; 否則,它被轉換爲一個unsigned int。這些被稱爲整數 促銷。所有其他類型均不受整數升級的影響。

所以,不,實現在法律上不能轉換成unsigned intint,除非你通過鑄造或轉讓的方式要求明確。

EDIT:的6.3.1.1 Boolean, characters, and integers第2讀作:

- 一個對象或表達的整數類型,其整數轉換秩爲int和unsigned int的少 比秩。

(國際標準ISO/IEC 9899第二版1999-12-01)

- 一個對象或表達的整數類型,其整數轉換秩小於小於或等於秩int和unsigned int。

(WG14/N1256委員會草案 - Septermber 7,2007年ISO/IEC 9899:TC3)

- (比int之外或無符號整型)的物體或表達的整數類型,其整數轉換等級爲小於或等於 int和unsigned int的等級。

(N1548委員會草案 - 2010年12月2日ISO/IEC 9899:201X,
N1570委員會草案 - 2011年4月12日ISO/IEC 9899:201X)

而只是爲了好玩,C + + 11的4.5 Integral promotions [conv.prom]

比BOOL,char16_t,char32_t,或wchar_t的其整轉換 秩(4.13)以外的整數類型的prvalue小於INT的秩可以被轉換成一個int類型的prvalue如果int可以代表全部 的源類型的值;否則,源prvalue可以轉換爲類型爲unsigned int的prvalue。

(N3242 = 11-0012,
N3337日期:2012-01-16,
國際標準ISO/IEC 14882第三版2011-09-01)

+0

整數的促銷活動不會先到? 「整數升級在兩個操作數上執行**然後**將下列規則應用於升級的操作數:」 – Alexandros

+0

但這些升級適用於級別小於「int」的類型,適用於各種「short」和「 char'和位域。它們不適用於'unsigned int'。見'6.3.1.1布爾,字符和整數'的子句2。 –

+0

整數轉換等級不必嚴格小於「整型轉換等級小於**或**等於**到整型和無符號整型等級的整數類型的對象或表達式」。 – Alexandros