【发布时间】:2016-09-13 09:06:48
【问题描述】:
我不明白为什么链接位移操作不会返回与不链接它们相同的结果。
#include <stdio.h>
void bit_manip_func(unsigned char byte)
{
unsigned char chain = (((byte >> 3) << 7) >> 3);
printf("%d\n", chain); //this prints 144
unsigned char o1 = byte >> 3;
unsigned char o2 = o1 << 7;
unsigned char o3 = o2 >> 3;
printf("%d\n", o3); //this prints 16 as expected
}
int main()
{
//expecting both printf's to print
//the same value (16).
bit_manip_func(73);
return 0;
}
我希望 printf 调用都打印出 16,因为二进制中的 73 是 0100 1001。应用 byte >> 3 后,我应该得到 0000 1001,在 (byte >> 3) << 7 之后,结果应该是 1000 0000,在 @987654328 之后@结果应该是0001 0000,当然是16。到底发生了什么?
【问题讨论】:
-
Integer promotion,每隔一段时间就会有人问这样的问题。
-
可能,但我不知道这与整数提升有关。
-
要记住一条重要的规则:
int是 C 中的一种特殊类型,所有较小的类型在计算过程中都会被提升为int。这也是为什么为 16 位架构编译的源代码(其中int是 16 位宽)在编译为 32 位时会有不同的行为。