C语言signed char位运算后printf输出结果为101的原因求解
C语言printf位移运算输出结果解析
相关代码复现:
signed char c=0x10; printf("%x", c<<0x4|c>>0x4);
运算过程逐步骤拆解:
- C语言默认存在整数提升规则:长度小于
int的整数类型(比如signed char)在参与位运算、算术运算前,会先隐式转换为int类型再执行运算。 - 初始值
signed char c = 0x10对应的8位二进制为00010000,属于正数,转换为32位int后值为0x00000010,高位全部补0。 - 执行
c << 0x4:0x00000010左移4位,结果为0x00000100。 - 执行
c >> 0x4:signed类型默认采用算术右移,因原值为正数,高位补0,0x00000010右移4位后结果为0x00000001。 - 执行按位或运算:
0x00000100 | 0x00000001的结果为0x00000101,对应的十六进制表示就是101。 printf的%x格式符会以无符号十六进制格式输出传入的int值,因此最终打印结果为101。
内容的提问来源于stack exchange,提问作者LogicNotFound
相关产品推荐
相关产品推荐

