【问题标题】:integer size in c depends on what?c中的整数大小取决于什么?
【发布时间】:2011-03-10 05:50:08
【问题描述】:

整数的大小取决于什么?

C 中的 int 变量的大小取决于机器还是编译器?

【问题讨论】:

标签: c


【解决方案1】:

它依赖于实现。 C 标准只要求:

  • char 至少有 8 位
  • short 至少有 16 位
  • int 至少有 16 位
  • long 至少有 32 位
  • long long 至少有 64 位(1999 年添加)
  • sizeof(char) ≤ sizeof(short) ≤ sizeof(int) ≤ sizeof(long) ≤ sizeof(long long)

在 16/32 位时代,事实上的标准是:

  • int 是“本机”整数大小
  • 其他类型是允许的最小尺寸

但是,64 位系统通常int 设为 64 位,这会造成具有三个 64 位类型而没有 32 位类型的尴尬情况。 一些编译器将long扩展为64位。

【讨论】:

【解决方案2】:

形式上,所有基本数据类型(包括它们的大小)的表示都依赖于编译器,并且仅依赖于编译器。编译器(或者更准确地说,是实现)可以充当程序和机器之间的抽象层,将机器完全隐藏在程序之外或以任何它喜欢的方式扭曲它。

但实际上,编译器旨在为给定的机器和/或操作系统生成最高效的代码。为了实现基本数据类型应该具有给定机器和/或操作系统的自然表示。从这个意义上说,这些表示间接依赖于机器和/或操作系统。

换句话说,从抽象、形式和迂腐的角度来看,编译器可以完全忽略特定于机器的数据类型表示。但这没有实际意义。在实践中,编译器充分利用了机器提供的数据类型表示。

不过,如果机器不支持某些数据类型,编译器仍然可以通过在编译器级别实现其支持(“模拟”它)向程序提供该数据类型。例如,64 位整数类型通常在 32 位机器的 32 位编译器中可用,即使机器不直接支持它们。过去,编译器通常会为未配备浮点协处理器(因此不直接支持浮点类型)的机器提供浮点类型的编译器级支持。

【讨论】:

  • 这个答案比我的好很多。
  • 交叉编译很实用。加上这一点,这个答案接近完美。实际上,您可以澄清一下“机器”是指目标机器。
【解决方案3】:

这主要取决于编译器。例如,如果您有一个 64 位 x86 处理器,您可以使用旧的 16 位编译器得到 16 位整数,使用 32 位编译器得到 32 位整数,或者使用 64 位编译器得到 64 -位整数。

编译器针对特定处理器的程度取决于处理器,并且(例如)古老的 16 位处理器根本不会运行针对闪亮的新 64 位处理器的代码。

C 和 C++ 标准确实保证了一些最小尺寸(间接通过指定最小支持范围):

char: 8 bits
short: 16 bits
long: 32 bits
long long: 64 bits

还保证大小/范围按以下顺序严格不递减:char、short、int、long 和 long long1

1long long 在 C99 和 C++0x 中指定,但一些编译器(例如 gcc、Intel、Comeau)也允许在 C++03 代码中使用它。如果你愿意,你可以说服大多数人(如果不是全部)拒绝 C++03 代码中的long long

【讨论】:

    【解决方案4】:

    正如 MAK 所说,它依赖于实现。这意味着它取决于编译器。通常,编译器以单台机器为目标,因此您也可以将其视为与机器相关的。

    【讨论】:

    • 也就是说编译器的设计是按机器设计的??
    • 有时。一些编译器(例如 gcc)是跨平台的,可以针对多台机器。一些编译器只针对一台机器(对于针对嵌入式处理器的编译器尤其如此)。如果我没记错的话,数据类型大小的规则是这样的: sizeof(char) == 1; sizeof(char)
    【解决方案5】:

    AFAIK,数据类型的大小依赖于实现。这意味着完全由实现者(即编写编译器的人)来选择它将是什么。

    所以,简而言之,它取决于编译器。但通常使用最容易映射到底层机器字长的任何大小更简单——因此编译器通常使用最适合底层机器的大小。

    【讨论】:

    • 但是如果我们使用像 c 编译器这样的 16 位编译器,它需要 16 位,如果我们在同一个机器上使用 vc++,那么它需要 32 位,那么它如何使用底层机器的大小??
    • @shubhangi Motling:底层机器通常支持16位整数类型以及32位整数类型。所以这里完全没有问题。
    • @shubhangi 看答案的第二句,还有“经常”这个词,重复了两次。
    【解决方案6】:

    无论您拥有什么硬件,这都取决于运行环境。如果您使用的是 DOS 等 16 位操作系统,那么它将是 2 个字节。在 Windows 或 Unix 等 32 位操作系统上,它是 4 个字节,依此类推。即使您在 64 位处理器上运行 32 位操作系统,大小也只有 4 个字节。我希望这会有所帮助。

    【讨论】:

    • 如果准确的话会更有帮助。虽然编译器的默认设置通常与运行环境相匹配,但也可以进行交叉编译。
    【解决方案7】:

    这取决于架构(机器、可执行类型)和编译器。 C 和 C++ 仅保证某些最小值。 (我认为这些是 char:8 位,int:16 位,long:32 位)

    C99 包括某些已知的宽度类型,例如 uint32_t(如果可能)。见stdint.h

    更新:解决了 Conrad Meyer 的顾虑。

    【讨论】:

    • 只有在硬件合理支持的情况下才强制使用固定宽度类型。
    • @Conrad Meyer,您的意思是 uint32_t 在某些机器上不会是 32 位的,还是 uint32_t 在某些机器上不可用?我的意思是前者不会发生,但欢迎更正。
    • uint32_t 如果硬件支持 32 位整数,则必须为 32 位,如果不支持则根本不定义。如果您需要支持非 16/32/64 位系统,请改用 uint_leastN_t 类型。
    • 这确实是我的意思。感谢您的确认并说清楚。
    【解决方案8】:

    整数变量的大小取决于编译器的类型:

    • 如果您有 16 位编译器:

      size of int is 2 bytes
      char holds 1 byte
      float occupies 4 bytes
      
    • 如果您有 32 位编译器:

      每个变量的大小在 16 位编译器中只是其大小的两倍

      int hold 4 bytes
      char holds 2 bytes
      float holds 8 bytes 
      

    如果你有一个 64 位编译器,也会发生同样的事情,等等。

    【讨论】:

      猜你喜欢
      • 2011-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-17
      • 2019-07-26
      • 1970-01-01
      • 2020-03-16
      • 2014-07-30
      相关资源
      最近更新 更多