C 班次和班次分配产生不同的结果

C 班次和班次分配产生不同的结果,c,bit-shift,C,Bit Shift,我的目标是从这个8位整数的左边删除字节计数+1位(或者像你经常说的那样,无符号字符) 应该很简单,但是这段代码 uint8_t val = 0xC3; uint8_t byte_count = 2; uint8_t cc = val << (byte_count+1) >> (byte_count+1); printf("%X", cc); 只给了我3 是的,我试过在它周围加上一堆括号。 是的,我已尝试将表达式中的所有内容强制转换为uint8\u t

我的目标是从这个8位整数的左边删除
字节计数+1
位(或者像你经常说的那样,
无符号字符

应该很简单,但是这段代码

uint8_t val = 0xC3;
uint8_t byte_count = 2;
uint8_t cc = val << (byte_count+1) >> (byte_count+1);
printf("%X", cc);
只给了我
3

是的,我试过在它周围加上一堆括号。
是的,我已尝试将表达式中的所有内容强制转换为
uint8\u t

为什么会发生这种情况?

促销

当我在几个关键词上绊倒的时候,我找到了提升,并在谷歌上搜索了它

较小的数据类型将在表达式中隐式提升为int/unsigned。 详细解释一下

因为我们的初始
uint8\t
操作数被提升为一个更高的位计数整数,然后将其移位(在本例中)3并返回将不再“删除”这些位。这是因为它们在第一次移位时不再位于位边界之外

当然,移位赋值也不会发生同样的情况,因为左操作数是左值(这意味着它表示内存,无法调整大小)。它还返回表示左操作数的左值,因此也无法提升

printf("%d\n", sizeof(
    (uint8_t)2 + (uint8_t)3
));

//Output: 4

Re“您不能转换左操作数,因为它是左值”:转换确实发生。在
cc@EricPostpischil中,因此基本上与执行
cc=cc相同
printf("%d\n", sizeof(
    (uint8_t)2 + (uint8_t)3
));

//Output: 4