2016-04-24 21 views
5

Şu anda uint8_t kullanmam gereken proje üzerinde çalışıyorum. Bir problem buldum, birisi bana bunun neden olduğunu açıklayabilir mi?uint8_t VS uint32_t farklı davranış

//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 

beklendiği gibi çıktı bu durumda

ancak ilk hattı ve ben çıkış uint8_t kullandığınızda bu davranış bana sıkıntı neden olan

ff 
ff 

olduğunu.

Yardımlarınız için teşekkür ederiz. Zaten detaylı olarak izah yorumlandığı gibi Marek

+1

'~ (DIGIT_T) 0' ~ (int) (DIGIT_T)' denktir Bu hile yapmak gerekir 0 'veya sadece ~ ~ 0 '. Hem C hem de C++ kurallarına göre, aritmetik ve bitsel işleçlerin argümanları, bütünleşik promosyonlara tabidir. Bkz. [İntegral tanıtım paragrafı] (http://en.cppreference.com/w/cpp/language/implicit_conversion). – ach

+2

İntegral promosyon kuralları, 'DIGIT_T'' int' yerine daha küçük bir aralığı destekliyorsa, '~ (DIGIT_T) 0'' '(int) 0' değerine eşittir. – Peter

+0

posta kodu "C++" değil "C", "c" etiketi – user3629249

cevap

1

, bu tamsayı promosyon kaynaklanır. Tabii için kısaltılabilir

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

:

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

Live demo

İlgili konular