【问题标题】:What should be the sizeof(int) on a 64-bit machine? [duplicate]64 位机器上的 sizeof(int) 应该是多少? [复制]
【发布时间】:2012-04-17 18:51:09
【问题描述】:

可能重复:
size of int, long, etc
Does the size of an int depend on the compiler and/or processor?
What decides the sizeof an integer?

我正在使用64-bit 机器。

$ uname -m
x86_64
$ file /usr/bin/file
/usr/bin/file: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, stripped
$ 

当我运行以下程序时,我得到了sizeof(int)4-bytes

#include <stdio.h>

int main(void)
{
    printf("sizeof(int) = %d bytes\n", (int) sizeof(int));

    return 0;
}

如果我正在运行16-32-64- 位机,那么这是否意味着integer 的大小是16-32-64- 位分别?

在我的机器中,我发现WORD_BIT32。在64-bit 机器上不应该是64 吗?

$ getconf WORD_BIT
32
$ 

而且,在上述情况下,sizeof(int) 不应该是 64-bits (8 bytes) 吗?

【问题讨论】:

  • 我不是 C 人,但我相信除了 char 之外的任何东西的大小都是特定于编译器的,也不一定是处理器上一个字的大小。
  • @minitech: char 也是编译器特定的
  • sizeof(char) 根据定义始终为 1。 char 是 sizeof 返回的隐含单位。
  • 说“这是一台 64 位机器”的丑陋之处在于:64 位是什么? 64位数据总线?地址总线?整数寄存器?

标签: c++ c sizeof


【解决方案1】:

在任何 64 位 C/C++ 编译器上,指针的大小应为 8 字节,但不一定为 int 大小。

【讨论】:

  • 这是一个重要的观察结果。 32 位架构上的指针是 32 位宽的,这意味着它们不能寻址超过 4GB 的内存。
  • 64b 编译器的定义是什么?如果地址空间被限制为 4GB 32b 指针可以正常工作。
  • @XTF 对,x32 是真实存在的:64 位 CPU 的架构,但具有 32 位指针,ints 和 @987654323 @s:wiki.debian.org/X32Port
  • @underscore_d:我想知道为什么 x32 不经常用作模型?许多程序甚至都没有接近使用一个 gig 的内存,在这些程序中使用 64 位指针似乎是一种纯粹的浪费。
【解决方案2】:

不一定; “64 位机器”可能意味着很多东西,但通常意味着 CPU 有那么大的寄存器。类型的大小由编译器决定,它与实际硬件没有任何关系(尽管通常是这样);事实上,同一台机器上的不同编译器可以有不同的值。

【讨论】:

    【解决方案3】:

    不是真的。为了向后兼容,它是 32 位。
    如果你想要 64 位,你有 longsize_tint64_t

    【讨论】:

    • long 在 Windows 64 上为 4 个字节。
    • @Dani 64位Windows有什么异常? Linux 和 Windows 选择为它们的 64 位实现实现不同的data models,并不会使一个比另一个更正常。
    • @Prætorian:long 仍然是 32 位的事实。
    • 这不准确。在这两者中,Linux 的模型是选择。 Windows 的模型是由向后兼容性决定的,可能会追溯到 Windows 3,如果不是更多的话。
    • @Kaz:尽管大部分 Windows 98/XP 程序都不能在 Windows 7 下运行(我们甚至不要考虑 Windows 8)而没有兼容性黑客,即使这样,有些程序也不能。就目前而言,向后兼容 16 位 Windows 确实是个笑话。没有真正的理由。如果您问我,他们应该在 Win 7 中抛出任何超过某个阈值的东西(因为其中大部分都无法正常工作)。唉,那没有发生:(
    【解决方案4】:

    在 C++ 中,int 的大小没有明确指定。它只是告诉你它必须至少是short int 的大小,它必须至少和signed char 一样大。 char 的位大小也没有明确指定,尽管 sizeof(char) 被定义为 1。如果你想要 64 位 int,C++11 指定 long long 至少为 64 位。

    【讨论】:

    • 没有明确指定char 的大小是一种误导。 sizeof(char) 根据定义为 1(因此 char 是一个字节)。唯一不同的“大小”是它使用的位数:CHAR_BITS,至少为 8。还要注意一个字节可以有超过 8 位。
    • 您需要查找有关sizeof 运算符的语义。由于我没有 C++ 标准文档,我只能告诉你 C99 对此有何看法(我知道 C++ 对此表示同意):“sizeof 运算符产生其操作数的大小(以字节为单位)。 "和“当应用于类型为 charunsigned charsigned char(或其限定版本)的操作数时,结果为 1”
    • @Anthales 你是绝对正确的,C++11 标准中的§5.3.3。感谢您指出这一点。
    • 是的,这是其中之一,要么必须事先知道,要么您最终偶然发现,阅读标准。除了没有人真的想阅读标准。 ;)
    • 在这里说一个 char 是一个字节是相当没有意义的,但是作为一个字节是一个实现定义的位数而不是假定的八位字节。这更像是一个向后的定义,并且更多地定义了一个 char 应该是系统定义一个字节的任何大小。
    猜你喜欢
    • 2013-12-05
    • 2014-01-10
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多