30

在我的 C# 源代码中,我可能将整数声明为:

int i = 5;

或者

Int32 i = 5;

在当前流行的 32 位世界中,它们是等价的。但是,随着我们进入 64 位世界,我是否正确地说以下内容将变得相同?

int i = 5;
Int64 i = 5;
4

10 回答 10

47

不,C# 规范严格定义它是32 位int的别名。System.Int32改变这将是一个重大的突破性变化。

于 2008-10-02T21:15:18.663 回答
43

C# 中的int关键字被定义为System.Int32类型的别名,这(从名称判断)意味着是一个 32 位整数。到规范:

CLI 规范第 8.2.2 节(内置值和引用类型)有一个包含以下内容的表:

  • System.Int32- 有符号 32 位整数

C# 规范第 8.2.1 节(预定义类型)有一个类似的表:

  • int- 32 位有符号整数类型

这保证了System.Int32在 CLR 和intC# 中始终是 32 位的。

于 2010-07-14T18:45:34.537 回答
18

sizeof(testInt) 会是 8 吗?

不, sizeof(testInt) 是一个错误。testInt 是一个局部变量。sizeof 运算符需要一个类型作为其参数。这永远不会是 8,因为它总是一个错误。

VS2010 将 ac# 托管整数编译为 4 个字节,即使在 64 位机器上也是如此。

正确的。我注意到 C# 规范的第 18.5.8 节定义sizeof(int)为编译时常量 4。也就是说,当您说 sizeof(int)编译器只是将其替换为 4 时;就像您在源代码中说“4”一样。

有谁知道 C# 中的标准“int”是否/何时会是 64 位?

绝不。C# 规范的第 4.1.4 节指出“int”是“System.Int32”的同义词。

如果您想要的是“指针大小的整数”,请使用 IntPtr。IntPtr 在不同的架构上改变它的大小。

于 2010-07-14T20:50:54.673 回答
12

intInt32在所有平台上始终是同义词。

微软不太可能在未来改变这一点,因为它会破坏许多假设int为 32 位的现有代码。

于 2010-07-14T18:45:30.610 回答
5

我认为您可能会感到困惑的是,它int是一个别名,Int32因此它始终为 4 个字节,但IntPtr假设与 CPU 架构的字长匹配,因此在 32 位系统上为 4 个字节,在 8 个字节上64位系统。

于 2010-07-14T19:00:30.423 回答
4

根据 C# 规范ECMA-334的“11.1.4 简单类型”部分,保留字int将别名为System.Int32. 由于这在规范中,因此不太可能更改。

于 2010-07-14T18:48:39.497 回答
3

无论您使用的是 32 位版本还是 64 位版本的 CLR,在 C# 中,anint始终表示System.Int32并且long将始终表示System.Int64.

于 2008-10-02T21:28:38.427 回答
3

以下在 C#中将始终为真:

sbyte 有符号 8 位,1 字节

字节无符号 8 位,1 字节

符号 16 位,2 字节

ushort无符号 16 位,2 字节

int 有符号 32 位,4 字节

uint无符号 32 位,4 字节

符号 64 位,8 字节

ulong无符号 64 位,8 字节

整数文字只是一个数字序列(例如314159,没有任何这些显式类型。C# 将它分配给它适合的序列(intuintlongulong )中的第一个类型。这似乎在上述至少一个回应中有点混乱。

奇怪的是,出现在一串数字之前的一元减号运算符(减号)不会将选择减少到(intlong)。字面量总是积极的;减号确实是一个运算符。所以想必-314159完全一样的东西-((int)314159)。除非显然有一种特殊情况可以-2147483648直接进入int;否则它会是-((uint)2147483648)。我认为这会做一些不愉快的事情。

不知何故,预测 C#(和朋友)永远不会为 >=128 位整数的“软名称”类型而烦恼似乎是安全的。只要处理器支持进行如此广泛的数学运算,我们就会得到对任意大整数的良好支持和对 UInt128、UInt256 等的超精确支持,并且几乎不使用其中的任何一个。64 位地址空间真的很大。如果它们太小,那将是出于某种深奥的原因,例如 ASLR 或更高效的 MapReduce 之类的。

于 2016-07-04T03:50:03.860 回答
0

是的,正如 Jon 所说,与“C/C++ 世界”不同,Java 和 C# 不依赖于它们所运行的系统。它们严格定义了字节/短/整数/长和单/双精度浮点数的长度,在每个系统上都相等。

于 2008-10-02T21:22:03.843 回答
-1

不带后缀的 int 可以是 32 位也可以是 64 位,这取决于它所代表的值。

如 MSDN 中所定义:

当整数文字没有后缀时,它的类型是第一个可以表示其值的类型:int、uint、long、ulong。

这是地址: https ://msdn.microsoft.com/en-us/library/5kzh1b5w.aspx

于 2015-08-20T23:31:12.670 回答