0

为什么 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);
4

1 回答 1

2

隐式促销。

您在使用二进制补码以本机机器格式表示数据的系统上,char已签名并且int在您的机器上有 8 位和 32 位。

和in被隐式提升c,因此变为。是,被符号扩展为 32 位所以它是. 然后发生所以结果值为。2c<<2int(int)c << (int)2c0xAB(int)c0xffffffab<<20xfffffeac

是先c <<= 2存储0xfffffeacinside的值c,然后整个表达式的值变成c赋值后的值。因此,c << 2being的结果被(int)0xfffffeac转换为charon assignment to c。因为char您的机器上有 8 位,所以该值被截断为 8 位并c等于0xac. 再说一次,默认参数提升发生在变量参数函数调用中作为变量参数列表一部分的每个参数上printf(const char *, ...);,例如- 每个参数都..经过默认参数提升。那么c现在beeing等于0xac再次符号扩展到32位到int,所以变成0xffffffac.

于 2020-05-19T14:18:37.257 回答