【问题标题】:size of int variableint 变量的大小
【发布时间】:2012-09-26 05:20:42
【问题描述】:

int的大小是如何决定的?

int 的大小是否真的取决于处理器。 32位机器是32位,16位是16位。

在我的机器上它显示为 32 位,尽管该机器安装了 64 位处理器和 64 位 Ubuntu。

【问题讨论】:

标签: c int 32bit-64bit processor


【解决方案1】:

这取决于实现。 C标准唯一保证的是

sizeof(char) == 1

sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)

还有一些类型的可表示最小值,这意味着 char 至少有 8 位长,int 至少有 16 位长,等等。

因此必须由实现(编译器、操作系统等)决定并记录在案。

【讨论】:

  • 我遇到了一个带有short long 的编译器。 int 是 16 位,short long 是 24。
  • @detly 该编译器的创建者当然很有幽默感。
  • 是的,double 的大小被指定为“24 或 32”。这是用于微处理器的。
  • 这些保证是不完整的。也必须是CHAR_BIT 至少为 8,sizeof(int) * CHAR_BIT 必须至少为 16,等等。See here for more
  • 严格来说,该标准对整数类型的范围提出了要求,而不是它们的大小。在存在填充位的情况下,如果int 的填充位比long 多,则可能有sizeof (long) &lt; sizeof (int)。 (这样的实现不太可能。)
【解决方案2】:

这取决于编译器。

例如:尝试使用旧的 turbo C 编译器,它会为 int 提供 16 位的大小,因为在编写编译器时字长(处理器可以轻松处理的大小)是 16。

【讨论】:

  • 要(非常)迂腐;它将为sizeof int 提供2,并且一个字节中有CHAR_BIT 位。 sizeof返回字节数,一个字节不一定有8位。
【解决方案3】:

这取决于主编译器。 如果您使用 turbo c 表示整数大小为 2 个字节。 否则,您使用的是 GNU gccompiler 意味着整数大小为 4 个字节。 它仅取决于 C 编译器中的实现。

【讨论】:

    【解决方案4】:

    整数的大小基本上取决于您系统的architecture。 一般来说,如果你有一台16-bit 机器,那么你的compiler 必须支持size 2 byte. 的int 如果您的系统是 32 位的,那么编译器必须支持 4 字节的整数。

    更详细的,

    • data bus 的概念出现在画面中是的,16 位,32 位仅表示系统中的 size of data bus
    • 需要数据总线大小来确定整数的大小,因为,数据总线的目的是向处理器提供数据。它可以在单次取指时提供给处理器的最大值很重要,这个最大值大小编译器更喜欢在时间给出数据。
    • 根据您系统的数据总线大小,编译器是 旨在提供数据总线的最大大小为整数大小。
    x06->16-bit->DOS->turbo c->size of int->2 byte
    x306->32-bit>windows/Linux->GCC->size of int->4 byte
    

    【讨论】:

    • 感谢信息,关于 64 位的情况>Linux...在 64 位系统中,数据总线的大小为 64 位,编译器也显示 4 个字节
    • 这个概念是,在 64 位机器上,编译器最多可以支持 8 字节的数据,但这并不意味着它不能支持 4 字节。简单来说较低的系统可以兼容较高的系统,所以,系统是64位的,但编译器最高支持32位。所以显示为4字节,请检查最新的编译器版本。
    【解决方案5】:

    使int 尽可能宽不是最佳选择。 (由ABI 设计师做出选择。)

    像 x86-64 这样的 64 位架构可以有效地在 int64_t 上运行,因此 long 是 64 位是很自然的。 (微软在他们的 x86-64 ABI 中将 long 保留为 32 位,出于各种可移植性原因,考虑到现有的代码库和 API,这很有意义。这基本上是无关紧要的,因为实际上关心类型大小的可移植代码应该使用 int32_t 和 @ 987654328@ 而不是对intlong 做出假设。)

    在许多情况下,将int 设为int32_t 实际上可以生成更好、更高效的代码。 int 的数组每个元素仅使用 4B,其缓存占用空间仅为 int64_t 数组的一半。此外,特定于 x86-64,32 位操作数大小是默认值,因此 64 位指令需要一个额外的代码字节作为 REX 前缀。因此,32 位(或 8 位)整数的代码密度比 16 位或 64 位的要好。 (有关文档/指南/学习资源的链接,请参阅 wiki。)

    如果程序需要 64 位整数类型才能正确操作,则不会使用 int。 (将指针存储在 int 而不是 intptr_t 是一个错误,我们不应该让 ABI 变得更糟以适应这样的损坏代码。)编写 int 的程序员可能期望 32 位类型,因为大多数平台就是这样工作的。 (标准当然只保证16bits)。

    由于不期望 int 通常是 64 位(例如在 32 位平台上),并且将其设置为 64 位会使某些程序变慢(几乎没有程序更快),int 在大多数情况下是 32 位64 位 ABI。

    此外,还需要一个 32 位整数类型的名称,以便 int32_t 成为 typedef 的名称。

    【讨论】:

      【解决方案6】:

      是的。 int 大小取决于编译器大小。 对于 16 位整数,整数的范围在 -32768 到 32767 之间。对于 32 位和 64 位编译器,它会增加。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-19
        • 2020-08-13
        • 2021-11-29
        • 1970-01-01
        • 1970-01-01
        • 2021-12-01
        相关资源
        最近更新 更多