這是非常簡單的;移位操作結果的類型是LHS操作數的類型。對於大多數二元運算符而言,結果是基於LHS和RHS操作數的,但換算運算符不同。
unsigned char uc = 0x08;
unsigned short us = 0x0008;
unsigned int ui = 0x00000008;
unsigned long long ul = 0x0000000000000008;
(我假設sizeof(unsigned int) == 4
這個答案的細節必須改變,如果它是不同的,但其概念保持不變。)
現在考慮一些表達式:
uc + uc;
這兩種類型都轉換爲int
,結果爲int
。
us + us;
同樣,這兩種類型的被轉換爲int
,結果是int
。
us + ui;
ui + us;
us
中的值被轉換爲unsigned int
並且結果是unsigned int
(注意,在前面的值被轉換成signed int
又名int
)。
ui + ul;
ul + ui;
這些表達式的兩個轉換ui
到unsigned long long
,其結果是unsigned long long
。請注意,這些表達式是對稱的;結果的類型(並且實際上,與運算符一起,結果的值)不取決於LHS上的哪個值以及操作符的RHS上的哪個值。
對於普通的操作非常重要;現在輪班呢?
uc << uc;
的LHS是由通常的算術轉換轉換爲int
,結果是一個int
。
us << us;
此結果也是int
。
ui << ui;
此結果是unsigned int
。
ul << ul;
此結果是unsigned long long
。但是把這些類型混合起來呢?
uc << ul; // Result: int
ul << uc; // Result: unsigned long long
us << ui; // Result: int
ui << us; // Result: unsigned int
ui << ul; // Result: unsigned int
ul << ui; // Result: unsigned long long
LHS操作數的提升類型控制着結果的類型。對於短於int
的類型,結果爲int
;對於其他類型,類型是LHS操作數的類型。
這就是你所有的報價手段。
感謝您的回答和您的時間。我已經放棄了對我的問題的任何答案,當然也不期望這樣的好答案。 – Thokchom 2014-09-22 02:09:49