【发布时间】:2014-07-30 07:06:28
【问题描述】:
这可能是一个非常愚蠢的问题,所以请温柔一点。如果我运行以下代码:
#include <climits>
#include <cstdint>
#include <stdio.h>
typedef uint64_t obs;
int main () {
printf("Size : %i\n",sizeof(obs)*CHAR_BIT);
obs value = 1 << 3;
printf("Number: %zu\n",value);
printf("Bits : ");
for (size_t ind = 0; ind < sizeof(obs)*CHAR_BIT; ind++) {
if (value & (1 << ind)) {
printf("%zu ",ind);
}
}
}
对于各种 typedef,我得到以下 64 位数据类型的结果(我在 64 位系统上运行):
uint64_t / size_t / long unsigned
Size : 64
Number : 8
Bits : 3 35
其他长度如下:
uint32_t / uint16_t / uint8_t
Size : 32 / 16 / 8
Number : 8
Bits : 3
如果更改移位,64Bit 类型似乎有一个“镜像对应物”,它移位了 32Bit。当我更改 value 的值时也是如此。这是有原因的还是我错过了什么?
在 Win7 上使用 gcc
【问题讨论】:
-
1 << ind没有像您希望的那样工作,因为 1 是一个 32 位整数...更改为1LL << ind并且您不会在输出中看到第 35 位。跨度> -
将
%d或%i用于int,%zu用于size_t。对于uint64_t,要么使用我不记得名字的<inttypes.h>中的宏,要么转换为uintmax_t并使用%zu。 -
@KeithThompson,是的,显然你是对的。我没有为每种数据类型更改它。在这种情况下,也许我应该选择
cout。