【发布时间】:2012-03-14 05:55:29
【问题描述】:
int、System.Int16、System.Int32 和 System.Int64 除了尺寸有什么区别?
【问题讨论】:
int、System.Int16、System.Int32 和 System.Int64 除了尺寸有什么区别?
【问题讨论】:
每种类型的整数都有不同的存储容量范围
Type Capacity
Int16 -- (-32,768 to +32,767)
Int32 -- (-2,147,483,648 to +2,147,483,647)
Int64 -- (-9,223,372,036,854,775,808 to +9,223,372,036,854,775,807)
正如 James Sutherland 在his answer 中所说:
int和Int32确实是同义词;int会多一点 看起来很熟悉,Int32使 32 位对那些人来说更加明确 阅读您的代码。我倾向于在我需要的地方使用 int '一个整数',Int32大小很重要(密码, 结构),因此未来的维护者会知道扩大int如果合适,但应注意更改Int32变量 以同样的方式。生成的代码将是相同的:差异纯粹是其中之一 可读性或代码外观。
【讨论】:
int16 以节省内存资源不是更好吗,而不是简单地使用int?
int总是Int32,与系统无关。也许您正在考虑 C++?
这里唯一真正的区别是大小。这里所有的 int 类型都是有符号的整数值,具有不同的大小
Int16:2 个字节Int32 和 int:4 个字节Int64 : 8 个字节Int64 和其他的有一点不同。在 32 位平台上,Int64 存储位置的分配不能保证是原子的。对于所有其他类型,它都得到保证。
【讨论】:
32 bit Windows Operating System 中使用Int64,那么我可能面临哪些问题?有例子吗?
int
它是 C# 中定义的原始数据类型。
映射到FCL类型的Int32。
它是一个值类型,代表 System.Int32 结构。
它是有符号的,占用 32 位。
它的最小值为 -2147483648,最大值为 +2147483647。
Int16
是整箱类型。
在 C# 中,short 映射到 Int16。
它是一个值类型,代表 System.Int16 结构。
它是有符号的,占用 16 位。
它的最小值为 -32768,最大值为 +32767。
Int32
是整箱类型。
在 C# 中,int 映射到 Int32。
它是一个值类型,代表 System.Int32 结构。
它是有符号的,占用 32 位。
它的最小值为 -2147483648,最大值为 +2147483647。
Int64
是整箱类型。
在 C# 中,long 映射到 Int64。
它是一个值类型,代表 System.Int64 结构。
它是有符号的,占用 64 位。
它的最小值为 –9,223,372,036,854,775,808,最大值为 9,223,372,036,854,775,807。
【讨论】:
Int64 数据类型可以使用 L 或 l 后缀表示,而 Int16 或 Int32 在 C# 中没有后缀。
根据 Jeffrey Richter(.NET 框架开发的贡献者之一)的书“CLR via C#”:
int 是 C# 编译器允许的原始类型,而 Int32 是框架类库类型(适用于遵守 CLS 的语言)。实际上,int 在编译过程中会转换为 Int32。
还有,
在 C# 中,long 映射到 System.Int64,但在不同的编程中 语言,long 可以映射到 Int16 或 Int32。事实上,C++/CLI 确实 处理长 Int32。
事实上,大多数 (.NET) 语言甚至不会将 long 视为关键字,也不会 编译使用它的代码。
我见过这位作者,以及许多关于 .NET 的标准文献,他们更喜欢 FCL 类型(即 Int32)而不是特定于语言的原始类型(即 int),主要是关于此类互操作性问题。
【讨论】:
编辑:这对于 C# 来说并不完全正确,我在回答这个问题时错过了一个标签 - 如果有更具体的 C# 答案,请改为投票!
它们都代表不同大小的整数。
但是,有一个非常非常小的差异。
int16、int32 和 int64 都有一个固定大小。
int 的大小取决于您正在编译的架构 - C 规范仅将 int 定义为大于或等于 short,尽管实际上它是您所针对的处理器的宽度,即 可能 32位,但你应该知道它可能不是。
【讨论】:
什么都没有。类型之间的唯一区别 是它们的大小(以及它们可以表示的值的范围)。
【讨论】:
关于 16、32 和 64 类型的一个非常重要的说明:
如果您运行此查询... Array.IndexOf(new Int16[]{1,2,3}, 1)
您应该得到零(0),因为您要问...在 1、2 或 3 的数组中是 1。 如果您得到 -1 作为答案,则表示 1 不在 1、2 或 3 的数组中。
看看我发现了什么: 以下所有内容都应该给你 0 而不是 -1 (我已经在所有框架版本 2.0、3.0、3.5、4.0 中对此进行了测试)
C#:
Array.IndexOf(new Int16[]{1,2,3}, 1) = -1 (not correct)
Array.IndexOf(new Int32[]{1,2,3}, 1) = 0 (correct)
Array.IndexOf(new Int64[]{1,2,3}, 1) = 0 (correct)
VB.NET:
Array.IndexOf(new Int16(){1,2,3}, 1) = -1 (not correct)
Array.IndexOf(new Int32(){1,2,3}, 1) = 0 (correct)
Array.IndexOf(new Int64(){1,2,3}, 1) = -1 (not correct)
所以我的意思是,对于 Array.IndexOf 比较,只信任 Int32!
【讨论】:
short 以适应数组,而第二个字面量 1 被留下作为一个普通的int。 (int)1 不等于(short)1、(short)2、(short)3,因此结果为-1。
Array.IndexOf(new Int16(){1,2,3}, 1S)Array.IndexOf(new Int32(){1,2,3}, 1I)Array.IndexOf(new Int64(){1,2,3}, 1L) 一切正常。
Object[],Object 重载。 C# 在需要时将int 隐式提升为long(并且还将short 提升为int 或long),但不会隐式降低,而是使用object 重载。使用Option Strict On 或Off VB 将仅在提供统一类型时使用类型化重载,否则使用object 重载。
for Array.IndexOf comparisons, only trust Int32! 是错误的。如果您将最终的 1 参数转换为相应的 Array 类型,它会按预期工作。
int 和 int32 是一回事(32 位整数)int16 是短整型(2 字节或 16 位)int64 是长数据类型(8 字节或 64 位)【讨论】:
int 是 Int32 的别名,因此始终保证为 32 位。
它们告诉整数变量可以存储什么大小。要记住大小,您可以考虑 :-) 2 beer(2 bytes)、4 beer(4 bytes) 或 8 beer(8 bytes)。
Int16 :-2 啤酒/字节 = 16 位 = 2^16 = 65536 = 65536/2 = -32768 到 32767
Int32 :- 4 啤酒/字节 = 32 位 = 2^32 = 4294967296 = 4294967296/2 = -2147483648 到 2147483647
Int64 :- 8 啤酒/字节 = 64 位 = 2^64 = 18446744073709551616 = 18446744073709551616 /2 = -9223372036854775808 到 9223372036854775807
简而言之,您可以在 int16 中存储超过 32767 个值,超过 int32 中的 2147483647 值和超过 9223372036854775807 中的值 int64。
要了解上述计算,您可以观看此视频int16 vs int32 vs int64
【讨论】:
它们确实是同义词,但是我发现它们之间的区别很小,
1)创建enum时不能使用Int32
enum Test : Int32
{ XXX = 1 // gives you compilation error
}
enum Test : int
{ XXX = 1 // Works fine
}
2) Int32 属于系统声明。如果你删除using.System,你会得到编译错误,但int不会出现
【讨论】:
以上人的回答基本正确。 int, int16, int32 ...根据它们的数据保存能力而有所不同。但这就是编译器必须处理这些问题的原因——这是为了解决潜在的 2038 年问题。查看链接以了解更多信息。 https://en.wikipedia.org/wiki/Year_2038_problem
【讨论】:
Int=Int32 --> 原来的long类型
Int16 --> 原始 int
Int64 --> 新数据类型在 64 位系统后可用
"int" 仅用于向后兼容。我们应该真正使用新的 int 类型来使我们的程序更精确。
---------------
还有一件事我注意到没有类似于 Int16、Int32 和 Int64 的名为 Int 的类。所有有用的函数,如TryParse 整数都来自Int32.TryParse。
【讨论】: