【问题标题】:C datatype 'long'- on Intel x86 64-bit machineC 数据类型 'long'- 在 Intel x86 64 位机器上
【发布时间】:2015-10-21 02:27:59
【问题描述】:

在 Intel 文档中,我读到对于 Intel x86 64 位机器,C 数据类型“long”的大小为 8 字节。 但是,当我在具有 intel(R) core(TM)i3 - 64 位处理器的计算机上运行这个简单的代码时:

printf("size of long, is %d", sizeof(long));

控制台输出是 4(而不是 8)!任何人都可以解释这种差异或相同的原因。 谢谢

【问题讨论】:

  • 安装了哪个操作系统,是32位还是64位操作系统。
  • 你用的是什么编译器?
  • 什么编译器和哪个版本? 32位还是64位?
  • 心理调试:你在 Windows 上。微软的 long 是 32 位的,即使在 64 位版本上也是如此,因为愚蠢的尝试保持兼容性,所以你必须使用 long long
  • size_t 的格式说明符错误。正确的是%zu。您可能会调用未定义的行为,除非您使用的是 32 位操作系统。

标签: c


【解决方案1】:

所有 C 标准都说long 必须至少为 32 位,这意味着sizeof(long) >= 4sizeof 的单位,称为字节,在您可能的几乎所有平台上都有 8 位遇到)。

每个ABI 都定义了这些类型的大小。您需要有兼容的 ABI 来链接使用不同程序编译的代码,因此对于每种类型的处理器每个操作系统都有一个标准 ABI。这只是一种趋势:一些操作系统有多个 ABI,这取决于所使用的编译器和标准库。

处理器制造商通常会定义 ABI,但随后由操作系统和编译器供应商决定是否尊重它。

在 x86_64 上,英特尔指定 64 位 long。这是大多数操作系统所做的,但有一个主要例外:Windows。在 Windows 上,标准 ABI(系统库和供应商提供的开发工具使用的)具有 32 位 long。 64 位类型可用作int64_tlong long

【讨论】:

    【解决方案2】:

    试试sizeof(unsigned long long),应该是64位的。

    long 可能是 32 位

    【讨论】:

    • long 不保证为 32 位。
    • 不,保证 某些 编译器 for Windows。
    • 是的。 OP 似乎在 Windows 上使用其中之一(VS)。如果 OP 发布了 sizeof(long) 返回 8,我不会和你争论这个。您是否正在寻找技术上正确的(考虑到所有操作系统和编译器)。我根据OP的观察提供了答案。对于正确答案,您为什么要投反对票?
    • 只是好奇,Windows 上的哪个编译器给出“8”?
    猜你喜欢
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多