为什么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至int
,因此变为(int)c << (int)2
。 c
为0xAB
,(int)c
为sign-extended至32位,因此为0xffffffab
。然后发生<<2
,因此结果值为0xfffffeac
。
c <<= 2
首先将0xfffffeac
的值存储在c
内,然后整个表达式的值将成为赋值后的c
的值。因此,将c << 2
为(int)0xfffffeac
的结果在分配给char
时转换为c
。由于您的计算机上char
有8位,因此该值将被截断为8位,并且c
等于0xac
。然后,在default argument promotions变量参数调用中,each argument that is a part of the variable argument list发生printf(const char *, ...);
-..
之后的每个参数都经历默认参数提升。因此,现在将等于c
的0xac
再次符号扩展为int
的32位,因此变为0xffffffac
。