Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

uint8_t VS uint32_t different behaviour

I am currently working on project where I need to use uint8_t. I have found one problem, could someone explain to me why this happens ?

//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 this case the output is as expected

ffffffff
7fffffff

but when I uncomment the first line and I use uint8_t the output is

ff
ff

This behaviour is causing me troubles.

Thank you for your help.

Marek

like image 932
user3411282 Avatar asked Nov 09 '22 16:11

user3411282


1 Answers

As the comments already explained in details, this is caused by integer promotion. This should do the trick:

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

which can of course be shortened to:

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

Live demo

like image 176
Christophe Avatar answered Nov 14 '22 23:11

Christophe