int,Int16,Int32和Int64有什么区别?


Answers:


348

每种类型的整数都有不同的存储容量范围

   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)在回答中所说:

int并且Int32确实是同义词;int看起来会更加熟悉,Int32使32位代码对阅读您的代码的人更加明确。我倾向于在只需要“整数”的Int32地方使用int,在整数很重要的地方(密码,结构),以便将来的维护人员知道int适当的话可以安全地放大 int ,但应注意Int32以相同的方式更改变量。

生成的代码将是相同的:区别纯粹是可读性或代码外观之一。


1
如果您知道该值不会超过65,535(有符号)或−32,768至32,767(无符号),那么定义整数int16以节省内存资源不是更好的选择,而不是简单地使用int
2014年

8
int和int32可以是同义词,但不必如此。如今,大多数出售的系统都是64位,在这种情况下,int将是64位。
马丁·奥托

4
对于Matthew T. Baker和其他任何像我这样来这里尝试从性能角度决定使用哪个对象的人,您应该查看这篇文章,该文章表明Integer在许多情况下比Int16更有效:stackoverflow.com/questions/129023/ net-integer-vs-int16
Tony L.

19
@MartijnOtto这个问题被标记为C#。在C#中,始终int是,无论使用什么系统。也许您在考虑C ++? Int32

9
@MattBaker:通常,在现代计算机上,一个int16占用的空间与一个int32(实际上是一个int64)一样大,因为为了使大多数操作高效,我们对数据进行填充以使访问与32位或64位边界对齐(分别在32位或64位模式下)。这是因为未对齐的访问在某些体系结构上效率低下,而在另一些体系结构上则不可能。
乔尔(Joel)

118

唯一真正的区别是大小。这里所有的int类型都是带符号的整数值,它们的大小各不相同

  • Int16:2个字节
  • Int32int:4个字节
  • Int64 :8个字节

Int64与其他之间只有一个小差异。在32位平台Int64上,不能保证对存储位置的分配是原子的。对于所有其他类型都可以保证。


如果我使用Int64in,32 bit Windows Operating System那么我可能会遇到什么问题?有什么例子吗?
shaijut

70

整型

它是用C#定义的原始数据类型。

它映射到FCL类型的Int32。

它是一个值类型,代表System.Int32结构。

它是有符号的,需要32位。

它的最小值为-2147483648,最大值为+2147483647。

16位

这是FCL类型。

在C#中,short映射到Int16。

它是一个值类型,表示System.Int16结构。

它被签名并占用16位。

它的最小值为-32768,最大值为+32767。

32位

这是FCL类型。

在C#中,int映射到Int32。

它是一个值类型,代表System.Int32结构。

它是有符号的,需要32位。

它的最小值为-2147483648,最大值为+2147483647。

整数64

这是FCL类型。

在C#中,long映射到Int64。

它是一个值类型,代表System.Int64结构。

它经过签名,占用64位。

它的最小值为–9,223,372,036,854,775,808,最大值为9,223,372,036,854,775,807。


只是要添加该Int64数据类型,而在C#中可以使用Ll后缀while Int16Int32不使用后缀来表示。
RBT

14

根据Jeffrey Richter(.NET框架开发的撰稿人之一)的书“通过C#进行CLR”所述:

int是C#编译器允许的原始类型,而Int32是Framework类库类型(可在遵循CLS的语言中使用)。实际上,在编译期间int会转换为Int32。

也,

在C#中,long映射到System.Int64,但是在另一种编程语言中,long可以映射到Int16或Int32。实际上,C ++ / CLI确实将Int32视为长期使用。

实际上,大多数(.NET)语言甚至都不会将其视为关键字,也不会编译使用该关键字的代码。

我已经见过这位作者,以及许多有关.NET的标准文献,它们主要针对此类互操作性,而更喜欢FCL类型(即Int32)而不是特定于语言的原始类型(即int)。


8

没有。类型之间的唯一区别它们的大小(因此,它们可以表示的值的范围)。


8

关于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!


7
为了阐明第一个示例为什么会这样工作:将第一个文字1、2和3隐式转换short为适合它们在数组中的位置,而第二个文字1保留为normal int(int)1不被认为是等于(short)1(short)2(short)3,因此,结果是-1。

4
对于C#版本,可以进行类似的调整,但是仅供参考,一个简单的类型说明符可以解决此问题:Array.IndexOf(new Int16(){1,2,3}, 1S) Array.IndexOf(new Int32(){1,2,3}, 1I) Array.IndexOf(new Int64(){1,2,3}, 1L)所有工作均按预期进行。
Mark Hurd 2014年

1
而那些不起作用的使用了Object[],Object过载。C#会在需要时隐式将inta 升高到a long(也将a升高shortintor long),但不会隐式地使用object重载将其降级。当提供统一类型时,With Option Strict OnOffVB将仅使用类型化的重载,否则将使用object重载。
Mark Hurd 2014年

您的回答有误导性。该代码正在比较不同类型的值。结论for Array.IndexOf comparisons, only trust Int32!是错误的。如果将最终1参数强制转换为相应的Array类型,则它将按预期工作。
唐·奇德尔

这是一个非常有趣且出乎意料的行为(因为int表示long的作品,而short表示int的作品则没有),因此请投票!
sth_Weird

7

编辑:对于C#来说,这不是真的,我回答这个问题时错过了一个标签-如果还有一个特定于C#的答案,请改为投票!


它们都代表大小不同的整数。

但是,差别很小。

int16,int32和int64均具有固定大小。

一个int的大小取决于您要编译的体系结构-C规范仅将一个int定义为大于或等于一个short,尽管实际上这是您要定位的处理器的宽度,大概是 32位,但是您应该知道可能不是。


1
这应该是公认的答案,因为这是唯一正确的答案
mjs 2014年

2
不,对于C#并非如此。AC#int始终为32位。对于C,是的,您必须处理这种复杂性,并且您经常会在C代码中看到宏来处理可变的int大小。请参阅ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf第18页。–阿南克
Ananke),

@Ananke Ahh,错过了C#标签。希望我能对答案作一些投票.....
mjs

6
  1. int并且int32是相同的(32位整数)
  2. int16 是short int(2个字节或16位)
  3. int64 是长数据类型(8个字节或64位)

2
int不保证为32位。
mjs 2014年

8
@mjs,这根本不是真的。在C#中,int是的别名Int32,因此始终保证为32位。
David Arno,2015年

实际上,mjs所说的是正确的,INT表示基于x86或x64系统的整数,因此,如果您的系统是x64,则int将是Int64,因此不能保证是32。如果将int32放在x64中,则始终是int32 。
Yogurtu'4

5
不,大卫·阿诺(David Arno)所说的是正确的。C#语言专门将“ int”定义为表示32位整数(Int32)。其他语言(C / C ++等)可能未指定,但是此问题标记为“ C#”。
西奥·布林克曼

@TheoBrinkman正确的,这里是微软的C#小号积分数值类型页:docs.microsoft.com/en-us/dotnet/csharp/language-reference/...
最大巴勒克拉夫

5

它们确实是同义词,但是我发现它们之间的细微差别,

1)Int32创建时不能使用enum

enum Test : Int32
{ XXX = 1   // gives you compilation error
}

enum Test : int
{ XXX = 1   // Works fine
}

2)Int32属于系统声明。如果删除using.System,则会出现编译错误,但不会出现int


-8

Int = Int32->原始长型

Int16->原始int

Int64-> 64位系统后,新数据类型可用

“ int”仅可用于向后兼容。我们应该真正使用新的int类型来使我们的程序更加精确。

---------------

我注意到的另一件事是,没有Int类似于Int16,Int32和Int64的类。所有有用的函数(例如TryParsefor integer)都来自Int32.TryParse

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.