为什么带等号的位移位会打印出与不等号情况相反的不同结果?

Why does bit shifting with equal sign prints out different result opposed to non-equal case?

为什么 01 和 02 的大小写不同?

char c=0xAB;
printf("01:%x\n", c<<2); // fffffeac
printf("02:%x\n", c<<=2); //ffffffac
printf("03:%x\n", c<<=2);

隐性促销。

您所在的系统使用 twos complement 表示本机机器格式的数据,char 已签名并具有 8 位,而 int 在您的计算机上具有 32 位。

c<<2中的c2implicitly promoted to int, so it becomes (int)c << (int)2. c is 0xAB, (int)c is sign-extended到32位所以是0xffffffab。然后 <<2 发生所以结果值为 0xfffffeac.

c <<= 2先把0xfffffeac的值存到c里面,然后整个表达式的值赋值后就变成了c的值。因此 c << 2 的结果 (int)0xfffffeac 在分配给 c 时被转换为 char。因为 char 在您的机器上有 8 位,所以该值被截断为 8 位并且 c 等于 0xac。然后,default argument promotions happen for each argument that is a part of the variable argument list 在可变参数函数调用中,如 printf(const char *, ...); - .. 之后的每个参数都会进行默认参数提升。那么 c 现在等于 0xac 再次符号扩展到 32 位到 int,所以变成 0xffffffac.