为什么 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);
为什么 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);
隐式促销。
您在使用二进制补码以本机机器格式表示数据的系统上,char
已签名并且int
在您的机器上有 8 位和 32 位。
和in被隐式提升为c
,因此变为。是,被符号扩展为 32 位所以它是. 然后发生所以结果值为。2
c<<2
int
(int)c << (int)2
c
0xAB
(int)c
0xffffffab
<<2
0xfffffeac
是先c <<= 2
存储0xfffffeac
inside的值c
,然后整个表达式的值变成c
赋值后的值。因此,c << 2
being的结果被(int)0xfffffeac
转换为char
on assignment to c
。因为char
您的机器上有 8 位,所以该值被截断为 8 位并c
等于0xac
. 再说一次,默认参数提升发生在变量参数函数调用中作为变量参数列表一部分的每个参数上printf(const char *, ...);
,例如- 每个参数都..
经过默认参数提升。那么c
现在beeing等于0xac
再次符号扩展到32位到int
,所以变成0xffffffac
.