这可能是一个非常愚蠢的问题,所以请保持温和。如果我运行以下代码:
#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类型似乎有一个&#34;镜像对应物&#34;它移动了32Bit。当我改变值的值时也是如此。这是有原因还是我错过了什么?
在Win7上使用gcc
答案 0 :(得分:2)
size_t取决于体系结构,因此32位系统size_t可能至少为32位宽。在64位系统上,它可能至少为64位宽。
根据C99 standard:
结果的值是实现定义的,它的类型(一个 无符号整数类型)是size_t,在
<stddef.h>
(和其他 头)
同时更改
if (value & (1 << ind))
到
if (value & (1LL << ind))
1为32位整数