我发现了一些我无法解释的奇怪现象。如果这里有人能看到发生了什么或为什么发生这种情况,我想知道。我正在做的是采用一个包含 12 位高位对齐的无符号短整型,如下所示:
1111 1111 1111 0000
然后我想移动这些位,以便 Short 中的每个字节都保留 7 位,并以 MSB 作为填充。上面显示的结果应如下所示:
0111 1111 0111 1100
我所做的是:
unsigned short buf = 0xfff;
//align high
buf <<= 4;
buf >>= 1;
*((char*)&buf) >>= 1;
这给了我一些看起来是正确的东西,但最后一次移位的结果留下了这样的位设置:
0111 1111 1111 1100
很奇怪。如果我使用无符号字符作为临时存储并进行移位,那么它就可以工作,如下所示:
unsigned short buf = 0xfff;
buf <<= 4;
buf >>= 1;
tmp = *((char*)&buf);
*((char*)&buf) = tmp >> 1;
结果是:
0111 1111 0111 1100
有什么想法吗?
最佳答案
是的,char
似乎已在您的平台上签名。如果您执行 *((unsigned char*)&buf) >>= 1
,它就会起作用。
关于c - C 中的位移位和指针怪异,寻找解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2844827/