2016-04-24 35 views
5

我目前正在從事需要使用uint8_t的項目。我發現了一個問題,有人可以向我解釋爲什麼會發生這種情況嗎?uint8_t VS uint32_t不同的行爲

//using DIGIT_T = std::uint8_t; 
using DIGIT_T = std::uint32_t; 
std::uint8_t bits = 1; 
DIGIT_T test1 = ~(DIGIT_T)0; 
std::cout << std::hex << (std::uint64_t)test1 << std::endl; 
DIGIT_T test2 = ((~(DIGIT_T)0) >> bits); 
std::cout << std::hex << (std::uint64_t)test2 << std::endl; 
在這種情況下,輸出爲預期

ffffffff 
7fffffff 

,但是當我去掉第一行,我用uint8_t輸出

ff 
ff 

此行爲導致我的煩惱。

謝謝你的幫助。

Marek

+1

'〜(DIGIT_T)0'相當於'〜(INT)(DIGIT_T) 0「或」〜0「。根據C和C++的規則,算術運算符和位運算符的論點都受到整體升級的限制。請參見[整體推廣段落](http://en.cppreference.com/w/cpp/language/implicit_conversion)。 – ach

+2

積分提升規則意味着如果DIGIT_T支持的範圍小於int,那麼'〜(DIGIT_T)0'等於'〜(int)0'。 – Peter

+0

發佈的代碼是'C++'而不是'C',請刪除'c'標籤 – user3629249

回答

1

由於意見已詳細解釋,這是由整數推廣引起的。這應該做的伎倆:

DIGIT_T test2 = ((DIGIT_T)(~(DIGIT_T)0) >> bits); 

其當然可以縮短爲:

DIGIT_T test2 = (DIGIT_T)~0 >> bits; 

Live demo