Architecture 是否有任何编程语言的变量类型大小以位为单位取决于平台(32位对64位)?

Architecture 是否有任何编程语言的变量类型大小以位为单位取决于平台(32位对64位)?,architecture,programming-languages,platform,Architecture,Programming Languages,Platform,我是C#开发人员,我几乎可以肯定,在这种语言中,“int”总是32位,不管平台是什么(32对64位),“long”总是64位,float是32,double是64,依此类推 有哪种语言不是这样的?如果int大小取决于处理器?C/C++中int等的大小没有正式定义-它们是特定于编译器的;更多细节 谢天谢地,C#设计器在规范中正式规定了:int=System.Int32,long=System.Int64,等等,所以您不必担心它的变化。X64中唯一容易发现的差异是 INTPr.Stase 8位<

我是C#开发人员,我几乎可以肯定,在这种语言中,“int”总是32位,不管平台是什么(32对64位),“long”总是64位,float是32,double是64,依此类推


有哪种语言不是这样的?如果int大小取决于处理器?

C/C++中int等的大小没有正式定义-它们是特定于编译器的;更多细节


谢天谢地,C#设计器在规范中正式规定了:int=System.Int32,long=System.Int64,等等,所以您不必担心它的变化。X64中唯一容易发现的差异是 INTPr.Stase

C++,例如,int被定义为处理器的“自然”字大小。如果查看limits.h(或climits,两者都是标准库的一部分),您将看到INT_MIN和INT_MAX常量,它们定义了INT类型的有效范围。C++的int数为32767或更小,而int最大值至少为32767。就我所记得的,唯一的要求是Marc Gravell在C++中所说的小

,对于所有平台定义的唯一几乎固定大小的类型是<强> char <强> > <强> 8位< /强>

其他类型比char大,但其大小与平台/编译器实现有关。标准仅规定开关应大于其他开关。

如中所述:

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

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

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

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

Char是唯一的无符号整数类型。其值表示Unicode字符,从
\u0000
\uffff
,即从0到216−1.

如果整数运算符的操作数类型为long,则另一个操作数也将转换为long类型。否则,操作将在int类型的操作数上执行,如有必要,较短的操作数将转换为int。转换规则是完全指定的

[摘自《理论计算机科学》电子笔记82第2期(2003)
Blesner Blech COCV 2003:,Jan Olaf Blech,
Fakultät für Informatik,
卡尔斯鲁厄大学
德国卡尔斯鲁厄)

c#提供的类型的大小取决于处理器、操作系统和可执行文件的位标志

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

CLR提供以下类型,这些类型的大小都随位的不同而变化:

  • 本机整数
  • 本机无符号整数
  • 本机引用(即指针)

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


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

浮点和双精度的大小是IEEE标准,而不是计算机标准。这就是为什么C、java、C++、C++和其他实现浮点和加倍的语言都有完全相同的舍入问题,并且不能真正用于货币计算,或者任何需要精度的计算。
short、int和long的大小由语言规范定义。但是,您不希望它们完全是任意的,因为使用这些数字进行计算时可能会导致任意行为。它们可能也是IEEE标准,但我不确定。

附加问题:我正确使用了“平台”这个词?或者这是一个“架构”问题?平台是好的,因为影响它的三个因素(在windows上)是支持64位的CPU、支持64位的操作系统和表示它希望以64位运行的进程(取决于头标志)。如果其中任何一个不是64位,那么不管怎样,它都以32位运行。1字节=8位绝对不是正式固定的。更正:虽然sizeof(char)始终是ond(即1字节),但字节不要求是八位字节(即有8位)。位/字节数定义为字符位。sizeof(char)==8位在最广泛使用的CPU上是正确的,但并不总是正确的。Michael Borgwardt>是的,这就是为什么我没有写“1字节=8位”,而是写“1字节(8位)”,意思是“这里我们讨论8位”。如你所愿,我
class Foo
{
  private float _v = ...; // Definitely 32-bit.

  void Test()
  {
    var v = _v; // Could be 32-, 64-, or 96-bit.

    if(v == _v) {
      ...
    }
  }
}
      Java Integers
--------------------------
Signed         |  Unsigned
--------------------------
long  (64-bit) |
int   (32-bit) |
short (16-bit) |  char (16-bit)
byte  (8-bit)  |