【发布时间】:2017-01-29 10:54:10
【问题描述】:
我对 C 中的位移做了一个小测试,所有位移 0、8、16 位都可以,我明白发生了什么。
但是我不清楚的 32 位右移或左移,我正在做测试的变量是 32 位长。
然后,我更改了保存移位结果的 32 位变量,但 32 位右左移位是一样的!
这是我的代码:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <inttypes.h>
int main() {
uint32_t code = 0xCDBAFFEE;
uint64_t bit32R = code >> 32;
uint16_t bit16R = code >> 16;
uint8_t bit8R = code >> 8;
uint8_t bit0R = code >> 0;
uint64_t bit32L = code << 32;
uint16_t bit16L = code << 16;
uint8_t bit8L = code << 8;
uint8_t bit0L = code << 0;
printf("Right shift:\nbit32R %.16x\nbit16R %x\nbit8R %x\nbit0R %x\n\n",
bit32R, bit16R, bit8R, bit0R);
printf("Left shift:\nbit32L %.16x\nbit16L %x\nbit8L %x\nbit0L %x\n\n",
bit32L, bit16L, bit8L, bit0L);
}
这是我得到的结果:
Right shift:
bit32R 00000000cdbaffee
bit16R 0
bit8R cdba
bit0R ff
Left shift:
bit32L 00000000cdbaffee
bit16L 0
bit8L 0
bit0L 0
Process returned 61 (0x3D) execution time : 0.041 s
Press any key to continue.
【问题讨论】:
-
您的代码调用了未定义的行为。
32的移位值对于 32 位int来说太大(如果您的平台有 16 位int,则对于 16 位也是如此)。并使用来自inttypes.h的PRInX宏来打印固定宽度的类型。您对整数运算的工作原理有误解。 -
我将包含文件更改为stdint!这并没有改变任何东西,但我忘记了 stdint,并包含了 inttypes。但我认为它们是相同的,至少对于我的代码而言。
-
也许在做出假设之前,最好先阅读标题提供的内容、它们之间的关系以及
PRInX的含义? -
你能简单地告诉我 inttypes 和 stdint 提供什么吗?
-
谷歌关闭了吗?
标签: c bit-manipulation