比特在size_t中出现两次

时间:2014-07-30 07:06:29

标签: c++ bits

这可能是一个非常愚蠢的问题,所以请保持温和。如果我运行以下代码:

#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

1 个答案:

答案 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位整数