2016-04-24 13 views
5

Ich arbeite gerade an einem Projekt, wo ich uint8_t benutzen muss. Ich habe ein Problem gefunden, könnte mir jemand erklären, warum das passiert?uint8_t VS uint32_t anderes Verhalten

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

in diesem Fall wird die Ausgabe als

ffffffff 
7fffffff 

erwartet, aber wenn ich die erste Zeile Kommentar- und ich verwende uint8_t der Ausgang ist

ff 
ff 

Dieses Verhalten mir Probleme verursacht.

Vielen Dank für Ihre Hilfe.

Marek

+1

'~ (DIGIT_T) 0 'entspricht' ~ (int) (DIGIT_T) 0 'oder nur' ~ 0 '. Gemäß den Regeln von C und C++ unterliegen Argumente von arithmetischen und bitweisen Operatoren integrierten Promotionen. Siehe [Integraler Absatz zur Absatzförderung] (http://en.cppreference.com/w/cpp/language/implicit_conversion). – ach

+2

Regeln der Integralpromotion bedeuten, dass '~ (DIGIT_T) 0' äquivalent zu '~ (int) 0' ist, wenn 'DIGIT_T' einen kleineren Bereich als ein' int' unterstützt. – Peter

+0

der gepostete Code ist 'C++' nicht 'C' bitte entfernen Sie das' c' Tag – user3629249

Antwort

1

Wie die Kommentare bereits ausführlich erläutert, wird dies durch ganzzahlige Förderung verursacht. Dies sollte den Trick:

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

die natürlich zu verkürzen:

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

Live demo