2012-06-26 159 views
7

與問題Bitshift and integer promotion?類似,我有一個關於使用左移位時整數提升的問題。整數推廣與運營商<<

unsigned int test(void) 
{ 
    unsigned char value8; 
    unsigned int result; 

    value8 = 0x12; 
    result = value8 << 8; 
    return result; 
} 

在這種情況下,將是value8第一促進unsiged INT或者是具體的實施?

6.5.7按位的移位運算符... 3 ...語義學對
整數優惠在每個操作數的執行。結果的類型是 升級左操作數的類型。如果右操作數的值爲負值或者大於或等於提升的左操作數的寬度,則行爲不確定。

它說「整數升級是在每個操作數上執行的。」,但這裏的促銷規則是什麼?

我認爲它應該是convert to int if lesser rank than int,但我找不到它。

我問這個問題,因爲一個編譯器(瑞薩nc30wa)沒有提升爲int,所以對於我的示例結果總是0。

在這個平臺上,char是8位寬,int 16位。

+2

如果value8沒有被提升,這是一個編譯器錯誤。 –

+1

這是一個問題,它是一個特定的錯誤還是實現? – jeb

+0

@jeb請參閱我的答案中的編輯,某些編譯器默認禁用整數提升,並將其記錄在編譯器文檔中。您必須在編譯器文檔中查找ISO一致性。 – ouah

回答

12

短語「整數優惠」是一個非常具體的東西,在實測值(爲C99)部分6.3.1.1 Booleans, characters, and integers

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

所以假設你unsigned char可以在int舉行,這將提升爲int。在那些難得的平臺上,unsigned charint一樣寬,它將推廣到unsigned int

這僅在C11稍微改變:

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

如果一個特定的編譯器沒有遵循這種行爲,那麼它不是真的符合。但是,鑑於您列出的編譯器是用於嵌入式系統的,這並不令人驚訝。

許多都是爲特定目的而構建的,並且要求列表中的一致性並不總是很高。可能有編譯器標誌可以使它更加符合標準。


看着你特別環境中,M16C Series,R8C Family C Compiler Package V.5.45 C Compiler(見here)已在部分2.1.4 nc30 Command Line Options,第f. Generated code modification options

-fextend_to_int(-fETI):
         在將char型數據擴展爲int類型後執行操作。根據ANSI標準擴展。

雖然我懷疑-fansi可能是一個更好的選擇,因爲它也涵蓋了一些其他的事情。

3

value8被提升爲int,假定unsigned char轉換秩大於int轉換秩(通常在大多數平臺的情況)下。

整數的轉換等級在C99 6.3.1.1中描述。

請注意,有些編譯器在默認情況下禁用整數升級規則。例如,MicroChip編譯器MPLAB C18。在編譯器的文檔中尋找ISO一致性。