为什么带等号的位移位会打印出与不等号情况相反的不同结果?
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
中的c
和2
是implicitly 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
.
为什么 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
中的c
和2
是implicitly 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
.