2014-09-21 29 views
0

我無法理解該行「移位的結果與移位的類型相同(積分後促銷後)「以下摘自C書的Mike Banahan (Section 2.8.2.3)您能否解釋一下 - 「涉及混合類型操作數的規則不適用於移位操作符」

重要的是,涉及混合類型操作數的規則不會將 應用於移位操作符。這種轉變的結果與 相同,轉移的東西(積分升級後)和 只取決於其他。

如果某些東西已經被提升爲一個整數(在移位運算符使用期間需要),那麼如何將它轉換回原來的相同類型,除非它當前位於賦值並且正在分配給與整型提升之前相同類型的變量?此外,「涉及混合類型操作數的規則不適用於移位操作符」的意思究竟是什麼意思?

請闡明問題的兩個部分。謝謝。

以下是本書的屏幕截圖,分別介紹了在使用按位運算符期間以及在混合表達式期間的促銷活動。

enter image description here

enter image description here

回答

1

這是非常簡單的;移位操作結果的類型是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; 

這些表達式的兩個轉換uiunsigned 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操作數的類型。

這就是你所有的報價手段。

+0

感謝您的回答和您的時間。我已經放棄了對我的問題的任何答案,當然也不期望這樣的好答案。 – Thokchom 2014-09-22 02:09:49

相關問題