我是 C# 开发人员,我几乎可以肯定,在这种语言中,“int”始终为 32 位,无论平台如何(32 位与 64 位),“long”始终为 64 位,float 为 32,double 为 64,并且很快。
有什么语言不是这样的吗?int 大小取决于处理器?
我是 C# 开发人员,我几乎可以肯定,在这种语言中,“int”始终为 32 位,无论平台如何(32 位与 64 位),“long”始终为 64 位,float 为 32,double 为 64,并且很快。
有什么语言不是这样的吗?int 大小取决于处理器?
C/C++ 中 int 等的大小没有正式定义——它们是特定于编译器的;请参阅此处了解更多详细信息。
谢天谢地,C# 设计人员在规范中正式规定:int = System.Int32、long = System.Int64 等 - 因此您不必担心它会发生变化。x64 上唯一明显的区别是IntPtr.Size
.
例如,在 C++ 中,int被定义为处理器的“自然”字长。如果您查看limits.h(或climits,它们都是标准库的一部分),您将看到 INT_MIN 和 INT_MAX 常量,它们定义了int类型的有效范围。INT_MIN 要求为 -32767 或更小,INT_MAX 要求至少为 32767。
正如这个问题中提到的:
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 到 2 16 -1。如果整数运算符具有 long 类型的操作数,则另一个操作数也将转换为 long 类型。否则,对 int 类型的操作数执行操作,如有必要,较短的操作数将转换为 int。转换规则是精确指定的。
[摘自《理论计算机科学电子笔记》 82 No. 2 (2003)
Blesner-Blech-COCV 2003:Sabine GLESNER , Jan Olaf BLECH,
Fakultät für Informatik,
Universität Karlsruhe
Karlsruhe, Germany]
允许 C 和 C++ 具有可变大小的 int……据我所知,唯一的要求是 small <= int <= long。因此,编译器当然可以在 32 位机器上生成 32 位整数,在 64 位机器上生成 64 位整数。
顺便说一句,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 寄存器)。
正如 Marc Gravell 在 C++ 中所说,唯一为所有平台定义了官方几乎固定大小的类型是char >= 8 bits。
其他类型比 char 大,但它们的大小与平台/编译器实现有关。该标准仅指定女巫应大于其他女巫。
c# 确实提供了一种类型,其大小取决于可执行文件IntPtr的处理器、操作系统和位数标志
此外,任何本身拥有引用类型的类型在 32/64 位上的大小都会有所不同,因为相应的引用本身是 32/64 位的。
CLR 提供了以下类型,这些类型都是可变大小的,具体取决于位数:
所有 C/C++ 标准都规定了不同数据类型大小之间的序数关系。根据实现的不同,大小可能会有所不同,并且很可能会随着您正在构建的 CPU 架构而有所不同;事实上,在 GCC 下,long 总是字长的(Linux 内核代码依赖于这个保证)。
良好的编程习惯意味着使用 sizeof() 而不是硬编码的大小。
float 和 double 的大小是 IEEE 标准,而不是计算机标准。这就是为什么 C#、Java、C、C++ 和所有其他实现 float 和 double 的语言都有完全相同的舍入问题,并且不能真正用于货币计算或任何需要精度的计算。
short、int 和 long 的大小由语言规范定义。但是,您不希望它们完全任意,因为在使用这些数字进行计算时可能会导致任意行为。它们也可能是 IEEE 标准,但我不确定。