unsigned long long 类型的位移位
Bitwise shift for unsigned long long type
在一个c程序中。我正在尝试在 uint64_t 变量上使用左移运算符。
例如
// with shift of 24 bits
uint64_t x = 0;
x = (((uint64_t)76) << (24));
Output is: x = 1275068416
---------------------------------------------
// with shift of 32 bits
uint64_t x = 0;
x = (((uint64_t)76) << (32));
Output is: x = 0
如果我执行左移直到 24 位然后它工作正常,但在 32 位它输出 0。而我认为 uint64_t 的大小即 unsigned long long 是 64 位。所以它不应该工作到 64 位移位吗?
您使用了错误的格式说明符来打印输出。 %d
格式说明符需要一个 int
,这在您的系统上显然是 32 位的。因此,传递一个 64 位值(以及一个无符号值)会导致未定义的行为。
您应该使用 PRIu64
宏来获取无符号 64 位值的正确格式说明符。
printf("%"PRIu64"\n", x);
在一个c程序中。我正在尝试在 uint64_t 变量上使用左移运算符。
例如
// with shift of 24 bits
uint64_t x = 0;
x = (((uint64_t)76) << (24));
Output is: x = 1275068416
---------------------------------------------
// with shift of 32 bits
uint64_t x = 0;
x = (((uint64_t)76) << (32));
Output is: x = 0
如果我执行左移直到 24 位然后它工作正常,但在 32 位它输出 0。而我认为 uint64_t 的大小即 unsigned long long 是 64 位。所以它不应该工作到 64 位移位吗?
您使用了错误的格式说明符来打印输出。 %d
格式说明符需要一个 int
,这在您的系统上显然是 32 位的。因此,传递一个 64 位值(以及一个无符号值)会导致未定义的行为。
您应该使用 PRIu64
宏来获取无符号 64 位值的正确格式说明符。
printf("%"PRIu64"\n", x);