2014-09-18 39 views
3

standard,我試圖瞭解表達式最終將其類型最多是:uint8_t乘以布爾值是什麼類型?

bool myBool; 
[...] 
uint8_t(255) * (myBool); 

我保證這myBool將被強制轉換爲uint8_t(又名unsigned char),或整個結果可能是int

有用的鏈接:bool to int conversion

+1

一般來說,這是沒有意義的。將數字乘以「真」或「假」是沒有意義的。就像數字42乘以橙色一樣。我建議重新編碼一些有意義的東西。讓編譯器優化它。 – 2014-09-18 16:36:15

+0

@ThomasMatthews我傾向於不同意你的評論:行爲在標準中有很好的定義。 – Antonio 2014-09-18 16:53:19

+0

那麼一個數字的語義含義是錯誤地加在一起的呢?請記住,乘法是重複的加法。所以你要添加* false *到一個數字。同樣,'true'和'false'是布爾或邏輯屬性,而不是數學屬性。它們可以映射到4和5或「青蛙」和「流浪者」,但它仍然沒有意義。這是*黑客*。 – 2014-09-18 19:36:09

回答

3

從文檔您鏈接到:意想不到算術操作數或enumera- 重刑型事業的轉換和產量結果類型以類似的方式

5表達式

9許多二元運算符。 目的是產生一個通用類型,這也是 結果的類型。

...

--Otherwise,積分優惠(conv.prom)須在兩個操作數執行 :該模式如下被稱爲通常的算術轉換, 其被定義。1)

4.5積分優惠

1類型char,符號的字符,無符號的字符,短整型,或 無符號短整數的右邊的值可以被轉換爲一個類型int的右值如果int 可以表示源類型的所有值;否則,源 右值可以被轉換成無符號整型

的右值...

4 bool類型的右值可以轉換爲int類型的右值,與 假變爲零和真成爲一個。

在你的情況,無論是LHS和RHS將晉升爲int算術運算之前,所得將int類型。

4

兩個操作數將晉升爲int,這將是結果類型。

通常,整數操作數至少被提升爲int,或者如果需要,可以提供更大的類型,並且算法不會在較小的類型上執行。這由C++ 11 4.5(集成促銷)來描述。

對於uint8_t

1 /大於boolchar16_tchar32_t,或wchar_t其整數轉換秩小於的int秩可以被轉換成類型的prvalue以外的整數類型的prvalue int如果int可以表示源類型的所有值;否則,源值可以轉換爲unsigned int類型的值。

如果它存在,則所有的8位uint8_t值可表示由int(必須是至少16個比特),所以int是提升的類型。

對於bool

6/bool類型的prvalue可以轉換爲int類型的prvalue,與false變爲零和true成爲一個。

因此,這也被提升爲int,給出了總體結果類型int

+0

另外,如果我做uint8_t(255)* uint8_t(myBool)? – Antonio 2014-09-18 16:39:03

+0

@Antonio:'uint8_t'將被提升爲'int'。 – 2014-09-18 16:42:02