【问题标题】:Bits apear twice in size_t位在 size_t 中出现两次
【发布时间】: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 &lt;&lt; ind 没有像您希望的那样工作,因为 1 是一个 32 位整数...更改为 1LL &lt;&lt; ind 并且您不会在输出中看到第 35 位。跨度>
  • %d%i 用于int%zu 用于size_t。对于uint64_t,要么使用我不记得名字的&lt;inttypes.h&gt; 中的宏,要么转换为uintmax_t 并使用%zu
  • @KeithThompson,是的,显然你是对的。我没有为每种数据类型更改它。在这种情况下,也许我应该选择cout

标签: c++ bits


【解决方案1】:

size_t 取决于体系结构,因此对于 32 位系统 size_t 可能至少为 32 位宽。在 64 位系统上,它可能至少为 64 位宽。

根据C99 standard

结果的值是实现定义的,它的类型(一个 无符号整数类型)是 size_t,在&lt;stddef.h&gt;(和其他 标题)

也改变

if (value & (1 << ind))

if (value & (1LL << ind))

因为 1 是一个 32 位整数

【讨论】:

  • 啊,好吧,这意味着如果我使用任何文字,即使我在 64 位系统上,它也会自动生成 32 位数字?
  • @magu_ 使用 64 位操作系统并不意味着您的程序也是 64 位的,这取决于目标设置
  • @magu_ 如果 1) 它适合 int 并且 2) 它没有后缀,则整数文字的类型为 int。所以1 将具有int 中的位数;在大多数当前实现中,这是 32 位,但也有例外。
  • @JamesKanze,这就是我喜欢这个网站的原因。你总能学到新东西。谢谢。
  • 我发现您的 C99 标准引用非常令人困惑......这将有助于提供它引用 sizeof 运算符结果的上下文(或者更好的是,引用 C++ 标准给出的问题标签)。干杯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多