【问题标题】:Is there any programming language where the variables types sizes in bits depends on the platform (32 vs 64 bit)?是否有任何编程语言的变量类型大小取决于平台(32 位与 64 位)?
【发布时间】:2009-01-29 13:18:53
【问题描述】:

我是 C# 开发人员,我几乎可以肯定,在这种语言中,“int”始终为 32 位,无论平台如何(32 位与 64 位),“long”始终为 64 位,float 为 32,a双64等等。

有什么语言不是这样的吗? int 大小在哪里取决于处理器?

【问题讨论】:

  • 附加问题:我正确使用了“平台”这个词吗?还是“架构”问题?
  • 平台很好,因为影响它的三件事(在 Windows 上)是支持 64 位的 CPU、支持 64 位的操作系统以及表明它希望以如果可能的话,64位。如果其中任何一个不是 64 位,那么无论如何它都会以 32 位运行。

标签: architecture programming-languages platform


【解决方案1】:

C/C++ 中 int 等的大小没有正式定义——它们是特定于编译器的; see here 了解更多详情。

谢天谢地,C# 设计人员在规范中正式规定:int = System.Int32、long = System.Int64 等 - 所以您不必担心它会发生变化。 x64 上唯一明显的区别是IntPtr.Size

【讨论】:

  • ECMA-335 公共语言基础设施说明了所有这些。保持 VB.Net 等的一致性。
  • @sixlettervariables - 好吧,不完全是......它可能说明了 Int32 的工作原理,但 C# 术语“int”可能被写成任何意思(可能取决于上下文)。
  • 只是为了补充答案:像 C 和 C++ 中的 int 这样的内置类型没有固定大小,但是两种语言的标准库都提供像 uint32_t/std::uint32_t 这样的别名,所以它是如果需要,可以有一个固定的大小
【解决方案2】:

例如,在 C++ 中,int 被定义为处理器的“自然”字长。如果您查看 limits.h(或 climits,它们都是标准库的一部分),您会看到 INT_MIN 和 INT_MAX 常量,它们定义了一个有效范围int 类型。 INT_MIN 要求为 -32767 或更小,INT_MAX 要求至少为 32767。

【讨论】:

    【解决方案3】:

    this question中所述:

    Classifying and Formally Verifying Integer Constant Folding

    Java 语言规范准确定义了如何表示整数以及如何计算整数算术表达式。这是 Java 的一个重要属性,因为这种编程语言被设计用于 Internet 上的分布式应用程序。 Java 程序需要独立于执行它的目标机器产生相同的结果

    相比之下,C(以及大多数广泛使用的命令式和 面向对象的编程语言)更加草率,并且留下了许多重要的特征。这种不准确的语言背后的意图 规范是明确的。相同的 C 程序应该在 16 位上运行, 32 位,甚至 64 位架构通过实例化整数算术 具有内置在目标处理器中的算术运算的源程序。这会导致更高效的代码,因为它可以使用可用的 直接机器操作。只要整数计算只处理 如果数字“足够小”,就不会出现不一致的情况。

    从这个意义上说,C 整数算术是一个没有精确定义的占位符 由编程语言规范,但仅通过确定目标机器完全实例化。

    Java 精确地定义了如何表示整数以及如何计算整数算术。

          Java Integers
    --------------------------
    Signed         |  Unsigned
    --------------------------
    long  (64-bit) |
    int   (32-bit) |
    short (16-bit) |  char (16-bit)
    byte  (8-bit)  |
    

    Char 是唯一的无符号整数类型。它的值代表Unicode字符,从\u0000\uffff,即从0到216-1。

    如果一个整数运算符有一个 long 类型的操作数,那么另一个操作数也将转换为 long 类型。否则对 int 类型的操作数执行操作,必要时将较短的操作数转换为 int。转换规则是准确指定的。

    [来自理论计算机科学中的电子笔记 82 No. 2 (2003)
    Blesner-Blech-COCV 2003:Sabine GLESNER,Jan Olaf BLECH,
    Fakultät für Informatik,
    卡尔斯鲁厄大学
    德国卡尔斯鲁厄]

    【讨论】:

      【解决方案4】:

      C 和 C++ 允许具有可变大小的 int...据我记得,唯一的要求是 small

      顺便说一句,C# 中浮点数和双精度数的大小仅用于存储定义 - 变量允许使用额外的精度。所以以下条件:

      class Foo
      {
        private float _v = ...; // Definitely 32-bit.
      
        void Test()
        {
          var v = _v; // Could be 32-, 64-, or 96-bit.
      
          if(v == _v) {
            ...
          }
        }
      }
      

      可能会或可能不会执行。 (在撰写本文时,如果可以,CLR 通常会在释放模式下使用 96 位 FP 寄存器)。

      【讨论】:

      • double 是 64 位,而不是 32 位。根据类型推断规则,“v”静态类型为 double。你能限定任何可能是 96 的情况吗?绝对不可能是 32 岁。
      • 在 x86 上,浮点寄存器是 96 位的。 CLR 允许 JITter 将浮点值和双精度值“提升”到 96 位寄存器,前提是不丢失准确性。存储(即成员变量)始终是指定的类型。
      【解决方案5】:

      c#确实提供了一种类型,其大小取决于可执行文件IntPtr的处理器、操作系统和位数标志

      此外,任何本身拥有引用类型的类型在 32/64 位上的大小都会有所不同,因为相应的引用本身是 32/64 位的。

      CLR 提供以下类型,这些类型都是可变大小的,具体取决于位数:

      • 原生int
      • 本机无符号整数
      • 本地引用(即指针)

      【讨论】:

        【解决方案6】:

        所有 C/C++ 标准都规定了不同数据类型大小之间的序数关系。根据实现的不同,大小可能会有所不同,并且很可能会随着您正在构建的 CPU 架构而有所不同;事实上,在 GCC 下,long 总是字长的(Linux 内核代码依赖于这个保证)。

        良好的编程习惯意味着使用 sizeof() 而不是硬编码大小。

        【讨论】:

          【解决方案7】:

          正如 Marc Gravell 在 C++ 中所说,唯一为所有平台定义了官方几乎固定大小的类型是 char >= 8 bits

          其他类型比 char 大,但它们的大小与平台/编译器实现有关。标准只规定女巫应该比其他女巫更大。

          【讨论】:

          • 1 字节 = 8 位绝对不是官方固定的。
          • 更正:虽然 sizeof(char) 始终为 ond(即 1 字节),但字节不需要是八位字节(即具有 8 位)。比特/字节的数量定义为 CHAR_BITS。 sizeof(char) == 8 bits 在最广泛使用的 CPU 架构上是正确的,但并不总是正确的。
          • Michael Borgwardt> 是的,这就是为什么我没有写“1 字节 = 8 位”而是“1 字节(8 位)”的意思是“我们在这里谈论 8 位”。根据您的喜好,我只能用“8 位”替换。
          • 标准只保证 char >= 8bits。一些较旧的机器 (PDP10) 使用 char == 9 位
          【解决方案8】:

          float 和 double 的大小是 IEEE 标准,而不是计算机标准。这就是为什么 C#、Java、C、C++ 和所有其他实现 float 和 double 的语言都存在完全相同的舍入问题,并且不能真正用于货币计算或任何需要精度的计算。

          short、int 和 long 的大小由语言规范定义。但是,您不希望它们完全任意,因为在使用这些数字进行计算时可能会导致任意行为。它们也可能是 IEEE 标准,但我不确定。

          【讨论】:

            猜你喜欢
            • 2012-08-10
            • 1970-01-01
            • 2013-01-29
            • 2013-08-19
            • 1970-01-01
            • 1970-01-01
            • 2011-03-30
            • 2010-11-11
            • 2016-02-22
            相关资源
            最近更新 更多