[英]Is resolving char between signed and unsigned int unspecified?
您的圖對於整數提升是正確的。 但是,在代碼function(c)
,不會發生整數提升。 這實際上是重載解決方案 。 如果只有一個function
則將c
轉換 (不提升)為參數的類型,無論哪種類型。
在重載解析規則中,如果可以通過整數提升使參數與參數匹配,則該函數將被視為比需要整數轉換才能匹配的另一個函數更好的匹配。
參見C ++ 14中的表12(第13.3.3.1.2節的一部分),該表列出了用於過載解析的隱式轉換序列的等級。
因此,您的代碼示例將在具有CHAR_MAX > INT_MAX
的系統上調用function(unsigned int)
。
但是,類型的大小是實現定義的 ,而不是未指定的 。
char
幾乎總是會轉換為int
。 每當sizeof(int) > sizeof(char)
無論char
是帶符號的還是無符號的, char
都將被提升為int
,就像您說過int
可以容納char
的整個范圍一樣。
唯一可以獲取unsigned int
是當sizeof(char) == sizeof(int)
。 在這種情況下,如果char
是無符號的,則它將被轉換為unsigned int
因為int
無法容納整個值范圍。
之所以會發生這種情況,是因為該標准僅指示int
必須至少具有與char
相同的存儲量,因此可能存在某些具有32位字節的系統,並且它們使char
和int
的大小相同。
所以這是實現定義的行為,因為您需要知道兩種類型的實現定義的大小以及char
的實現定義的簽名,才能知道會發生什么。
這只是一種C ++功能,稱為“隱式類型轉換/自動類型轉換/強制”。 當您將char傳遞給函數時,char隱式轉換為signed int。 就像代碼“ int a ='C';”一樣 您可以從此處了解有關強制的更多信息: http : //www.learncpp.com/cpp-tutorial/44-implicit-type-conversion-coercion/
在幕后,所有類型都用二進制數表示,因此類型只是解釋的一種方式。 您上面沒有說明這種機制
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.