c - C 中的位移位和指针怪异,寻找解释

标签 c pointers bit-shift

我发现了一些我无法解释的奇怪现象。如果这里有人能看到发生了什么或为什么发生这种情况,我想知道。我正在做的是采用一个包含 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/

相关文章:

将 char[][] 转换为 char** 会导致段错误?

c++ - FMOD 对象指针

java - 为什么在Java中使用以下两个移位运算符语句会返回两个不同的结果

c - 为什么我的 rgb 到 uint32 预处理器宏给我错误的颜色代码?

Kotlin 位移

c - aio_write 的错误

c - 将图像保存在 C 中

C 指针值 - LHS 值发生意外变化

C - 这个函数和指针组合是如何工作的?

c - 指针中的值自动删除