它可能(可能)有符號類型表示所有可用相應的無符號類型表示的數字。例如,如果使用31個值位和1個填充位表示無符號整數類型,並且使用31個值位和無填充位表示帶符號整數。是否允許這樣做?
該標準建立在6.3.1.8 Usual arithmetic conversions
:
否則,整數優惠是在兩個操作數執行。然後將 以下規則應用於提升的操作數: 如果兩個操作數具有相同類型,則不需要進一步轉換。否則,如果兩個操作數具有有符號整數類型或兩者都具有無符號整數類型 ,則類型爲較小整數轉換等級的操作數爲 轉換爲具有較高等級的操作數的類型。
否則,如果具有無符號整數類型的操作數的秩大於或 等於另一個操作數的類型的秩,然後用 符號整型操作數被轉換爲操作數的類型與無符號 整數類型。
由於int
和unsigned 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 int
int
,除非你通過鑄造或轉讓的方式要求明確。
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)
你不能得到一個夸脫成品脫瓶 - 這是一個成語,但是是真的 –