我发现了一些我无法解释的奇怪现象。如果这里有人可以看到这是什么或为什么会发生,我想知道。我正在做的是采用一个包含 12 位高对齐的无符号短,如下所示:
1111 1111 1111 0000
然后我想改变这些位,以便短字节中的每个字节保持 7 位,并将 MSB 作为填充。上面显示的结果应如下所示:
0111 1111 0111 1100
我所做的是这样的:
unsigned short buf = 0xfff;
//align high
buf <<= 4;
buf >>= 1;
*((char*)&buf) >>= 1;
这给了我一些看起来像是正确的东西,但是最后一次移位的结果使位设置如下:
0111 1111 1111 1100
很奇怪。如果我使用 unsigned char 作为临时存储并转移它,那么它就可以工作,如下所示:
unsigned short buf = 0xfff;
buf <<= 4;
buf >>= 1;
tmp = *((char*)&buf);
*((char*)&buf) = tmp >> 1;
结果是:
0111 1111 0111 1100
有什么想法吗?