從standard,我試圖瞭解表達式最終將其類型最多是:uint8_t乘以布爾值是什麼類型?
bool myBool;
[...]
uint8_t(255) * (myBool);
我保證這myBool
將被強制轉換爲uint8_t
(又名unsigned char
),或整個結果可能是int
?
有用的鏈接:bool to int conversion
從standard,我試圖瞭解表達式最終將其類型最多是:uint8_t乘以布爾值是什麼類型?
bool myBool;
[...]
uint8_t(255) * (myBool);
我保證這myBool
將被強制轉換爲uint8_t
(又名unsigned char
),或整個結果可能是int
?
有用的鏈接:bool to int conversion
從文檔您鏈接到:意想不到算術操作數或enumera- 重刑型事業的轉換和產量結果類型以類似的方式
5表達式
9許多二元運算符。 目的是產生一個通用類型,這也是 結果的類型。
...
--Otherwise,積分優惠(conv.prom)須在兩個操作數執行 :該模式如下被稱爲通常的算術轉換, 其被定義。1)
和
4.5積分優惠
1類型char,符號的字符,無符號的字符,短整型,或 無符號短整數的右邊的值可以被轉換爲一個類型int的右值如果int 可以表示源類型的所有值;否則,源 右值可以被轉換成無符號整型
的右值...
4 bool類型的右值可以轉換爲int類型的右值,與 假變爲零和真成爲一個。
在你的情況,無論是LHS和RHS將晉升爲int
算術運算之前,所得將int
類型。
兩個操作數將晉升爲int
,這將是結果類型。
通常,整數操作數至少被提升爲int
,或者如果需要,可以提供更大的類型,並且算法不會在較小的類型上執行。這由C++ 11 4.5(集成促銷)來描述。
對於uint8_t
:
1 /大於
bool
,char16_t
,char32_t
,或wchar_t
其整數轉換秩小於的int
秩可以被轉換成類型的prvalue以外的整數類型的prvalueint
如果int
可以表示源類型的所有值;否則,源值可以轉換爲unsigned int
類型的值。
如果它存在,則所有的8位uint8_t
值可表示由int
(必須是至少16個比特),所以int
是提升的類型。
對於bool
:
6/
bool
類型的prvalue可以轉換爲int
類型的prvalue,與false
變爲零和true
成爲一個。
因此,這也被提升爲int
,給出了總體結果類型int
。
另外,如果我做uint8_t(255)* uint8_t(myBool)? – Antonio 2014-09-18 16:39:03
@Antonio:'uint8_t'將被提升爲'int'。 – 2014-09-18 16:42:02
一般來說,這是沒有意義的。將數字乘以「真」或「假」是沒有意義的。就像數字42乘以橙色一樣。我建議重新編碼一些有意義的東西。讓編譯器優化它。 – 2014-09-18 16:36:15
@ThomasMatthews我傾向於不同意你的評論:行爲在標準中有很好的定義。 – Antonio 2014-09-18 16:53:19
那麼一個數字的語義含義是錯誤地加在一起的呢?請記住,乘法是重複的加法。所以你要添加* false *到一個數字。同樣,'true'和'false'是布爾或邏輯屬性,而不是數學屬性。它們可以映射到4和5或「青蛙」和「流浪者」,但它仍然沒有意義。這是*黑客*。 – 2014-09-18 19:36:09