C语言printf函数及输出问题

Log*_*und -1 c printf bit-shift integer-promotion

我需要帮助解决我心中的这个问题,所以如果有人有类似的问题,这会对我有很大帮助。

signed char c=0x10;
printf("%x", c<<0x4|c>>0x4); 
Run Code Online (Sandbox Code Playgroud)

为什么输出是101?

Vla*_*cow 5

在带有移位运算符的表达式中,整数提升应用于每个操作数,在本例中应用于对象c

来自 C 标准(6.5.7 移位运算符)

3 对每个操作数执行整数提升。结果的类型是提升后的左操作数的类型......

因此,在整数提升之后,它将表示为(假设sizeof( int )等于4

00000010
Run Code Online (Sandbox Code Playgroud)

这个表情

c<<0x4
Run Code Online (Sandbox Code Playgroud)

产生以下值

00000100
Run Code Online (Sandbox Code Playgroud)

和这个表达

c>>0x4
Run Code Online (Sandbox Code Playgroud)

产生以下值

00000001
Run Code Online (Sandbox Code Playgroud)

按位运算符 | 产量

00000100
|
00000001
========
00000101
Run Code Online (Sandbox Code Playgroud)

结果输出时不带前导零,如下所示

101
Run Code Online (Sandbox Code Playgroud)

也就是说,函数 printf 将 int 类型的结果值输出为 unsigned int 类型的对象,因为结果值可以用 unsigned int 类型的对象表示。

要获得您期望的结果,请使用长度修饰符,hh例如

printf("%#hhx", c<<0x4|c>>0x4);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,程序输出将是

0x1
Run Code Online (Sandbox Code Playgroud)