我的目标是从这个 8 位整数(或者您经常调用它,unsigned char
)左侧删除 byte-count+1
位.
应该很简单,但是就是这段代码
uint8_t val = 0xC3;
uint8_t byte_count = 2;
uint8_t cc = val << (byte_count+1) >> (byte_count+1);
printf("%X", cc);
结果是 C3
。
虽然这个
uint8_t val = 0xC3;
uint8_t byte_count = 2;
uint8_t cc = val;
cc <<= (byte_count+1);
cc >>= (byte_count+1);
printf("%X", cc);
只给我 3
。
是的,我试过在它周围加上一堆括号。
是的,我已尝试将表达式中的所有内容都转换为 uint8_t
。
为什么会这样?
最佳答案
促销。
在偶然发现几个关键字后,我找到了促销并用谷歌搜索了它。找到this answer .
较小的数据类型将在表达式中隐式提升为 int/unsigned。 This other answer详细解释。
因为我们的初始 uint8_t
操作数被提升为更高位数的整数,然后将其移位(在本例中)3 并返回将不再“删除”这些位。这是因为在第一个移位中它们将不再位于位边界之外。
移位赋值当然不会发生同样的情况,您不能转换左操作数,因为它是左值(意味着它代表内存,不可调整大小)。它还返回一个表示左操作数的左值,因此也无法提升。
printf("%d\n", sizeof(
(uint8_t)2 + (uint8_t)3
));
//Output: 4
关于c - 类次和类次分配给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62802986/