【问题标题】:Why do C compilers specify long to be 32-bit and long long to be 64-bit?为什么 C 编译器指定 long 为 32 位,long long 为 64 位?
【发布时间】:2011-11-08 22:04:38
【问题描述】:

制作 long 64 位并保留 long long 直到 128 位数字成为现实不是更有意义吗?

【问题讨论】:

  • 两件事:首先,long long 不一定是 64 位。其次,不是建议它是 128 位宽同样狭隘吗?我们应该为 1024 位硬件的普及做准备,对吧?
  • 实际上“C 编译器”不指定 long 是 32 位,int 不是 32 位,long long 也是 64 位。这一切都在很大程度上取决于编译器......所以你的问题是基于一个错误的前提。
  • 他们终于在 C99 中做到了:en.wikipedia.org/wiki/Stdint.h
  • @seljuq70: long long 不能被“保留”,因为 C99 标准保证了它的存在。在具有 16 位 int、32 位 long 和 64 位 long long 的 16 位系统上,它们都会有所不同,但就台式机而言,那些日子已经一去不复返了。我们不会坚持使用 16 位 int,以免我们觉得中间某处存在冗余类型。
  • @Eugene - 关于为什么不是所有东西都被标准修复的另一个讨论,请参阅这个问题Exotic-architectures-the-standard-committee-cares-about

标签: c 32bit-64bit long-integer bit long-long


【解决方案1】:

是的,确实有道理,但微软有自己的理由将“long”定义为 32 位。

据我所知,目前所有主流系统中,Windows 是唯一一个“long”为 32 位的操作系统。在 Unix 和 Linux 上,它是 64 位的。

所有适用于 Windows 的编译器都会在 Windows 上将“long”编译为 32 位,以保持与 Microsoft 的兼容性。

因此,我避免使用“int”和“long”。偶尔我会使用“int”来表示错误代码和布尔值(在 C 中),但我从不将它们用于任何依赖于类型大小的代码。

【讨论】:

  • 我在 32 位足够大的情况下使用 long,并且我不希望 int32_least_t 或我自己的 typedef 遍布我的代码。最好让依赖关系明显和明确,如果它在一个结构中,你可能会使用 int32_t 以避免在 long 更大的地方膨胀它,但确实有一点“不能被打扰这个”。
  • 许多嵌入式设备(2015 年每年数十亿)使用 32 位 long。几乎没有“所有主流系统……都是 64 位”。
【解决方案2】:

c 标准没有指定原始数据类型的位长,而只指定了它们的最小位长。因此编译器可以选择原始数据类型的位长。在决定每种原始数据类型的位长时,编译器设计者应该考虑几个因素,包括计算机体系结构。

这里有一些参考: http://en.wikipedia.org/wiki/C_syntax#Primitive_data_types

【讨论】:

    【解决方案3】:

    出于历史原因。很长一段时间(双关语),“int”表示 16 位;因此“长”为 32 位。当然,时代变了。因此“长长”:)

    PS:

    GCC(和其他)目前支持 128 位整数作为“(u)int128_t”。

    PPS:

    这里讨论了为什么 GCC 的人做出了他们所做的决定:

    http://www.x86-64.org/pipermail/discuss/2005-August/006412.html

    【讨论】:

      【解决方案4】:

      自从第一个用于通用可重编程微型计算机的 C 编译器出现以来,代码通常需要使用恰好保持 8、16 或 32 位的类型,但直到 1999 年,标准还没有t 明确地为程序提供任何方式来指定它。另一方面,几乎所有 8 位、16 位和 32 位微机的编译器都将“char”定义为 8 位, “短”为 16 位,“长”为 32 位。它们之间唯一的区别是 “int”是 16 位还是 32 位。

      虽然 32 位或更大的 CPU 可以使用“int”作为 32 位类型,但保留“long” 可作为 64 位类型使用,有大量的代码库 那个“长”将是 32 位。虽然 C 标准添加了“固定大小”类型 在 1999 年,标准中还有其他地方仍然使用“int”和 “long”,例如“printf”。虽然 C99 添加了宏来提供正确的格式 固定大小的整数类型的说明符,有大量的语料库 期望“%ld”是 int32_t 的有效格式说明符的代码,因为 它几乎可以在任何 8 位、16 位或 32 位平台上运行。

      出于对 现有的代码库可以追溯到几十年前,或 64 位,以避免需要 识别 64 位类型的更详细的“long long”或“int64_t”是 可能是一个判断电话,但鉴于新代码可能应该支持 在实际情况下使用指定大小的类型,我不确定我是否看到了令人信服的 制作“long”64 位的优势,除非“int”也是 64 位(这将 对现有代码造成更大的问题)。

      【讨论】:

        【解决方案5】:

        d 32 位微机定义“char”为 8 位,“short”为 16 位,“long”为 32 位。它们之间唯一的区别是“int”是16位还是32位。

        虽然 32 位或更大的 CPU 可以将“int”用作 32 位类型,而将“long”用作 64 位类型,但有大量代码预计“long”将是32 位。虽然 C 标准在 1999 年添加了“固定大小”类型,但标准中还有其他地方仍然使用“int”和“long”,例如“printf”。虽然 C99 添加了宏来提供

        【讨论】:

          【解决方案6】:

          C99 N1256 standard draft

          long 和 long long 的大小是实现定义的,我们所知道的是:

          • 最小尺寸保证
          • 类型之间的相对大小

          5.2.4.2.1 整数类型的大小<limits.h> 给出了最小大小:

          1 [...] 它们的实现定义值的大小(绝对值)应等于或大于所示值 [...]

          • UCHAR_MAX 255 // 2 8 - 1
          • USHRT_MAX 65535 // 2 16 - 1
          • UINT_MAX 65535 // 2 16 - 1
          • ULONG_MAX 4294967295 // 2 32 - 1
          • ULLONG_MAX 18446744073709551615 // 2 64 - 1

          6.2.5 类型 然后说:

          8 对于任意两个具有相同符号和不同整数转换等级的整数类型 (见 6.3.1.1),整数转换等级较小的类型的取值范围是 其他类型值的子范围。

          和6.3.1.1 布尔、字符和整数确定相对转换等级:

          1 每个整数类型都有一个整数转换等级,定义如下:

          • long long int 的秩应大于 long int 的秩,即 应该大于int的rank,int的rank应该大于short的rank int,应大于signed char的等级。
          • 任何无符号整数类型的等级应等于相应的等级 有符号整数类型(如果有)。
          • 对于所有整数类型 T1、T2 和 T3,如果 T1 的秩大于 T2 并且 T2 具有 排名大于 T3,则 T1 排名大于 T3

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-08-01
            • 2013-12-05
            • 2017-02-08
            • 2011-03-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-20
            相关资源
            最近更新 更多