我目前正在处理需要使用uint8_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
这种行为给我带来了麻烦。
感谢您的帮助。
马立克
答案 0 :(得分:1)
由于评论已经详细解释,这是由整数提升引起的。这应该可以解决问题:
DIGIT_T test2 = ((DIGIT_T)(~(DIGIT_T)0) >> bits);
当然可以缩短为:
DIGIT_T test2 = (DIGIT_T)~0 >> bits;