int 是 64 位 C# 中的 64 位整数吗?

Posted

技术标签:

【中文标题】int 是 64 位 C# 中的 64 位整数吗?【英文标题】:Is an int a 64-bit integer in 64-bit C#? 【发布时间】:2010-09-14 22:41:27 【问题描述】:

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

int i = 5;

Int32 i = 5;

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

int i = 5;
Int64 i = 5;

【问题讨论】:

顺便说一句,IntPtr 就是那种结构。请参阅Size 属性的文档,它对此有所了解。 【参考方案1】:

没有。 C# 规范严格定义 intSystem.Int32 的别名,正好是 32 位。改变这将是一个重大的重大改变。

【讨论】:

此外,据我所知,即使在 x64 中,只有指针和大小 (size_t) 是 64 位宽,而默认整数仍然是 32 位宽。 Asaf:在某些依赖于编译器的语言中。例如,在 C++ 中,64 位 gcc 将 long 定义为 64 位,而 Visual C++ 将 long 定义为 32 位。 C# 不是这样的语言,决定是标准化的,不留给编译器供应商。【参考方案2】:

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

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

System.Int32 - 有符号 32 位整数

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

int - 32 位有符号整数类型

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

【讨论】:

System.Int64 会很高兴知道这一点。【参考方案3】:

sizeof(testInt) 会是 8 吗?

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

VS2010 将 c# 托管整数编译为 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 在不同的架构上会改变其大小。

【讨论】:

【参考方案4】:

int 在所有平台上始终是 Int32 的同义词。

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

【讨论】:

言归正传! MS 认为向后兼容性很重要。语言的一致性是我 @P.Brian.Mackey 我和你在一起。感谢开发者,我们终于有了一种 C 风格的语言,它足够大胆,可以实际定义其基本数据类型。 -1 .... 这将是一个明确的语言更改,这是极不可能的。正是这个“预定”大小是 C# 的一加。 @TomTom:……我就是这么说的。 编译器中编译成 32 位或 64 位整数的选项怎么样?【参考方案5】:

我想你可能会感到困惑的是 intInt32 的别名,所以它总是 4 个字节,但 IntPtr 应该与 CPU 架构的字长匹配,所以它将是在 32 位系统上为 4 个字节,在 64 位系统上为 8 个字节。

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

无论您使用的是 32 位版本还是 64 位版本的 CLR,在 C# 中,int 始终表示System.Int32long 始终表示System.Int64

【讨论】:

【参考方案8】:

以下将always be true在C#中:

sbyte 有符号 8 位,1 字节

字节无符号8位,1字节

short 有符号 16 位,2 字节

ushort 无符号 16 位,2 字节

int 有符号 32 位,4 字节

uint 无符号 32 位,4 字节

long 有符号 64 位,8 字节

ulong无符号64位,8字节

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

Weirdly 一元减号运算符(减号)出现在一串数字之前不会将选择减少到 (int , )。字面量总是积极的;减号确实是一个运算符。所以大概-314159-((int)314159) 完全一样。除了显然有一个特殊情况可以让-2147483648 直接进入 int;否则它将是-((uint)2147483648)。我认为这会造成不愉快的事情。

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

【讨论】:

【参考方案9】:

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

【讨论】:

在 C/C++ 世界中,int 依赖于编译器,而不是底层硬件。大多数 64 位 C++ 编译器仍然使用 32 位整数,但指针将是 64 位而不是 32 位。 而在 C 世界中,他们实际上对 C99 的整个方案失去了信心,并决定不再使用 long get 而是添加 long long。在某种程度上,这是承认具有不可预测(在扩展的时间尺度上)大小的类型是一个问题。【参考方案10】:

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

如 MSDN 中所定义:

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

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

【讨论】:

这是不正确的,来源被误解了。它谈论的是整数文字,而 int 总是 32 位长。

以上是关于int 是 64 位 C# 中的 64 位整数吗?的主要内容,如果未能解决你的问题,请参考以下文章

64位整数乘法讲解-And-AcWing-90. 64位整数乘法

64 位计算机如何处理长整数?如何确定对象的大小? [关闭]

64位整数乘法讲解-And-AcWing-90. 64位整数乘法-方法二

64位整数乘法讲解-And-AcWing-90. 64位整数乘法-《算法竞赛进阶指南》

64位整数乘法讲解-And-AcWing-90. 64位整数乘法-方法二-《算法竞赛进阶指南》

int在64位操作系统中占多少位