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?
在带有移位运算符的表达式中,整数提升应用于每个操作数,在本例中应用于对象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)