为什么0x56 << 2不等于0x58?
0x56被 0 1 0 1 0 1 1 0 如此移2位,我们得到的左
0 1 0 1 1 0 0 0
Run Code Online (Sandbox Code Playgroud)
01011000是0x58.但它不是正确的答案0x158.所以我在这里缺少什么?
即使我这样做:
int main(){
unsigned char a;
a=0x56;
printf("%x",a<<2); // I am expecting the output to be 58 here.
}
Run Code Online (Sandbox Code Playgroud)
为什么打印158. 为什么不考虑只有8位?
比特移位运算符<<,并>>仅在整数的工作.因此,当您在此处使用它时,它们首先被提升为int(大于1个字节),然后完成转换.您可以看到标准中提到的是6.5.7p3
对每个操作数执行整数提升.结果的类型是提升的左操作数的类型.
printf(with %x和format specifier)也期望参数是类型的unsigned int.因此,没有降级执行,你得到0x158.
如果您希望结果只有一个字节,则应将结果转换回unsigned char-
printf("%x", (unsigned char)(a << 2));
Run Code Online (Sandbox Code Playgroud)
或者你可以声明另一个变量b并打印出来 -
unsigned char b;
b = a << 2;
printf("%x", b);
Run Code Online (Sandbox Code Playgroud)
你可以在这里看到演示.
| 归档时间: |
|
| 查看次数: |
95 次 |
| 最近记录: |