C 为什么相同的按位操作会产生不同的结果?

C 为什么相同的按位操作会产生不同的结果?,c,bitwise-operators,unsigned,signed,C,Bitwise Operators,Unsigned,Signed,正在尝试在所有其他位都打开的情况下关闭MSB unsigned char a = ~0 << 1 >> 1; printf("a: %d\n", a); unsigned char b = ~0; b <<= 1; b >>= 1; printf("b: %d\n", b); 整数升级规则适用 对每个操作数执行整数提升。结果的类型是提升的左操作数的类型 初始化的RHS: unsigned char a = ~0 << 1 >&

正在尝试在所有其他位都打开的情况下关闭MSB

unsigned char a = ~0 << 1 >> 1;
printf("a: %d\n", a);

unsigned char b = ~0;
b <<= 1;
b >>= 1;
printf("b: %d\n", b);

整数升级规则适用

对每个操作数执行整数提升。结果的类型是提升的左操作数的类型

初始化的RHS:

unsigned char a = ~0 << 1 >> 1;
“多重分配”版本(避免未定义的行为)相当于:

unsigned char a = (unsigned char)(~0U << 1) >> 1;
unsigned char a=(unsigned char)(~0U>1;

它在重新升级右移位的类型之前截断左移位的结果,并将产生127作为结果(仍然假设
CHAR\u BIT==8
)。

整数升级规则适用

对每个操作数执行整数提升。结果类型为提升后的左操作数类型

初始化的RHS:

unsigned char a = ~0 << 1 >> 1;
“多重分配”版本(避免未定义的行为)相当于:

unsigned char a = (unsigned char)(~0U << 1) >> 1;
unsigned char a=(unsigned char)(~0U>1;

它在重新提升右移位类型之前截断左移位的结果,并将产生127作为结果(仍然假设
CHAR\u BIT==8
).

您的代码段依赖于实现定义的行为。您使用错误的类型说明符来
printf
一个
unsigned char
。在我看来,运算符绑定的优先级不同。@WillemVanOnsem即使添加括号以明确优先级也没有任何区别。~0>1对int执行整个操作-键入数字(通常为4字节),然后在最后将结果向下截断为字符(1字节)。但在b计算中,您会在过程中的每一步都进行截断。在左位移位后,需要将变量转换为
无符号字符
,以生成127。这将得到127:
无符号字符a=((无符号字符)(~0>1;
您的代码段依赖于实现定义的行为。并且您使用了错误的类型说明符来
printf
一个
无符号字符
。在我看来,运算符绑定的优先级不同。@WillemVanOnsem即使添加括号以明确优先级也没有任何区别。~0>1执行整个操作在int类型的数字(通常为4字节)上,在最后将结果截短回字符(1字节)之前。但是在b计算中,在过程中的每一步都会截短。变量需要在左位移位后转换为
无符号字符
,以生成127。这就得到了127:
无符号字符a=((无符号字符)(~0>1;