我是C#开发人员,我几乎可以肯定,在这种语言中,无论平台如何,“int”总是32位(32对64位),“long”总是64位,float是32和a双64等等。
有什么语言不是那样的吗? int大小取决于处理器?
答案 0 :(得分:9)
C / C ++中int等的大小没有正式定义 - 它们是编译器特定的; see here了解更多详情。
C#设计师幸好在规范中正式指示:int = System.Int32,long = System.Int64等 - 所以你不必担心它会改变。 x64唯一容易引起注意的区别是IntPtr.Size
。
答案 1 :(得分:4)
例如,在C ++中, int 被定义为处理器的“自然”字大小。如果你查看 limits.h (或 climits ,两者都是标准库的一部分),你会看到INT_MIN和INT_MAX常量,它们定义了一个有效的范围 int 类型。 INT_MIN要求为-32767或更低,INT_MAX要求至少为32767.
答案 2 :(得分: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到2 16 -1。如果整数运算符的操作数类型为long,则另一个操作数也会转换为long类型。否则,对int类型的操作数执行操作,如果需要,将较短的操作数转换为int 。转换规则已准确指定。
[来自理论计算机科学的电子笔记82第2号(2003))
Blesner-Blech-COCV 2003:Sabine GLESNER,Jan Olaf BLECH,
FakultätfürInformatik,
UniversitätKarlsruhe
德国卡尔斯鲁厄]
答案 3 :(得分:2)
允许C和C ++具有可变大小的整数...据我记忆,唯一的要求是小< = 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寄存器)。
答案 4 :(得分:0)
正如Marc Gravell在C ++中所说,唯一为所有平台定义的官方几乎固定大小的类型是 char > = 8位。
其他类型比char大,但它们的大小与平台/编译器实现相关。标准只规定女巫应该比女巫更大。
答案 5 :(得分:0)
c#确实提供了一个类型,其大小取决于可执行文件的处理器,操作系统和位数标志IntPtr
此外,任何本身都包含引用类型的类型在32/64位上的大小会有所不同,因为引用本身也是32/64位。
CLR提供以下类型,这些类型都是可变大小,具体取决于位数:
答案 6 :(得分:0)
所有C / C ++标准都指定了不同数据类型大小之间的序数关系。根据实施情况,可能有不同的大小,并且很可能因您正在构建的CPU架构而异;实际上,在GCC下,long长度总是字大小的(Linux内核代码依赖于这种保证)。
良好的编程习惯意味着使用sizeof()而不是硬编码的大小。
答案 7 :(得分:0)
float和double的大小是IEEE标准,而不是计算机标准。这就是为什么C#,Java,C,C ++以及实现float和double的所有其他语言具有完全相同的舍入问题,并且不能真正用于货币计算或任何需要精确的计算。
short,int和long的大小由语言规范定义。但是,您不希望它们完全是任意的,因为在使用这些数字进行计算时可能会导致任意行为。它们也可能是IEEE标准,但我不确定。