为什么带等号的移位输出与非等号相反的结果?

问题描述 投票:0回答:1

为什么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);
c hex bit-shift byte-shifting
1个回答
2
投票

隐式促销。

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

c中的2c<<2implicitly promotedint,因此变为(int)c << (int)2c0xAB(int)csign-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 *, ...);-..之后的每个参数都经历默认参数提升。因此,现在将等于c0xac再次符号扩展为int的32位,因此变为0xffffffac

© www.soinside.com 2019 - 2024. All rights reserved.