我有一个程序
#include <stdint.h>
#include <stdio.h>
int main(void)
{
int i;
int x = 128;
int y = 128;
int z = 2;
int32_t coordinates = x | (y << 12) | (z << 16);
fprintf(stdout, "x = %d\n", (coordinates & 0xFF));
fprintf(stdout, "y = %d\n", ((coordinates >> 8) & 0xFF));
fprintf(stdout, "z = %d\n", ((coordinates >> 16) & 0xFF));
}
存储 x,y,z
在 32 位寄存器中,但仅对 { (x,y,z)< 256}
成功.如果我希望 x,y,z
成为可能获取 2^10 (1024)
的值(所以 (x,y,z)<1024
)这怎么会发生?我知道我应该使用 64 位寄存器(?),但我仍然坚持这一点,因为轮类正在发生一些事情。
有什么想法吗?
不要使用signed 类型,而是使用unsigned 类型。少了很多麻烦。 @Olaf
下面的代码允许 x
在与 y
发生碰撞之前有一个 12 位的范围。它允许 y
在与 z
碰撞之前有一个 4 位 (16 - 12) 的范围。它在 16 位 int/unsigned
上有问题。
int32_t coordinates = x | (y << 12) | (z << 16);
要允许 x,y,z
具有 10 位范围,请将 y
移动 10,将 z
移动 10+10。
uint32_t coordinates = x | ((uint32_t)y << 10) | ((uint32_t)z << 20);
精确值:
(一定要使用匹配的打印说明符。)
#include <inttypes.h>
...
fprintf(stdout, "x = %" PRIu32 "\n", (coordinates & 0x3FF));
fprintf(stdout, "y = %" PRIu32 "\n", ((coordinates >> 10) & 0x3FF));
fprintf(stdout, "z = %" PRIu32 "\n", ((coordinates >> 20) & 0x3FF));