Sự khác biệt giữa int, Int16, Int32 và Int64 là gì?


229

Sự khác nhau giữa là gì int, System.Int16, System.Int32System.Int64khác hơn so với kích thước của chúng?

Câu trả lời:


348

Mỗi loại số nguyên có phạm vi lưu trữ khác nhau

   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)

Như James Sutherland đã nêu trong câu trả lời của mình :

intInt32thực sự là đồng nghĩa; intsẽ trông quen thuộc hơn một chút, Int32làm cho độ 32 bit rõ ràng hơn đối với những người đọc mã của bạn. Tôi sẽ có xu hướng sử dụng int khi tôi chỉ cần 'một số nguyên', Int32trong đó kích thước là quan trọng (mã hóa, cấu trúc) để các nhà bảo trì trong tương lai sẽ biết rằng an toàn để phóng to intnếu phù hợp, nhưng nên cẩn thận thay đổi Int32các biến theo cùng một cách .

Mã kết quả sẽ giống hệt nhau: sự khác biệt hoàn toàn là sự dễ đọc hoặc xuất hiện mã.


1
Nếu bạn biết giá trị sẽ không vượt quá 65.535 (đã ký) hoặc −32.768 đến 32.767 (chưa ký) thì tốt hơn là xác định số nguyên là int16để lưu tài nguyên bộ nhớ, trái ngược với việc sử dụng đơn giản int?
ᴍᴀᴛᴛ

8
int và int32 có thể đồng nghĩa, nhưng chúng không cần. Ngày nay, hầu hết các hệ thống được bán là 64 bit, trong đó trường hợp int sẽ là 64 bit.
Martijn Otto

4
Đối với Matthew T. Baker và bất kỳ ai khác giống như tôi đến đây cố gắng quyết định sử dụng từ quan điểm hiệu suất, bạn nên xem bài đăng này cho thấy Integer hiệu quả hơn Int16 trong nhiều trường hợp: stackoverflow.com/questions/129023/ net-số-vs-int16
Tony L.

19
@MartijnOtto Câu hỏi được gắn thẻ C #. Trong C #, intluôn luôn Int32 , bất kể hệ thống. Có lẽ bạn đang nghĩ về C ++?

9
@MattBaker: Nói chung, trên các máy tính hiện đại, int16 chiếm nhiều dung lượng như int32 (và thực tế là int64) vì để hầu hết các hoạt động có hiệu quả, chúng tôi đệm xung quanh dữ liệu để truy cập được căn chỉnh theo ranh giới 32 hoặc 64 bit (ở chế độ 32 hoặc 64 bit tương ứng). Điều này là do các truy cập không được sắp xếp là không hiệu quả trên một số kiến ​​trúc, và không thể có trên các kiến ​​trúc khác.
Joel

118

Sự khác biệt thực sự duy nhất ở đây là kích thước. Tất cả các kiểu int ở đây là các giá trị nguyên đã ký có kích thước khác nhau

  • Int16: 2 byte
  • Int32int: 4 byte
  • Int64 : 8 byte

Có một sự khác biệt nhỏ giữa Int64và phần còn lại. Trên các bài tập nền tảng 32 bit cho một Int64vị trí lưu trữ không được đảm bảo là nguyên tử. Nó được đảm bảo cho tất cả các loại khác.


Nếu tôi sử dụng Int64trong 32 bit Windows Operating Systemđó các vấn đề tôi có thể phải đối mặt là gì? Có ví dụ nào không?
shaijut

70

int

Đây là kiểu dữ liệu nguyên thủy được xác định trong C #.

Nó được ánh xạ tới Int32 của loại FCL.

Nó là một loại giá trị và đại diện cho cấu trúc System.Int32.

Nó được ký và mất 32 bit.

Nó có giá trị tối thiểu -2147483648 và tối đa +2147483647.

Quốc tế 16

Đây là một loại FCL.

Trong C #, short được ánh xạ tới Int16.

Nó là một loại giá trị và đại diện cho cấu trúc System.Int16.

Nó được ký và mất 16 bit.

Nó có giá trị tối thiểu -32768 và tối đa +32767.

Int32

Đây là một loại FCL.

Trong C #, int được ánh xạ tới Int32.

Nó là một loại giá trị và đại diện cho cấu trúc System.Int32.

Nó được ký và mất 32 bit.

Nó có giá trị tối thiểu -2147483648 và tối đa +2147483647.

Int64

Đây là một loại FCL.

Trong C #, long được ánh xạ tới Int64.

Nó là một loại giá trị và đại diện cho cấu trúc System.Int64.

Nó được ký và mất 64 bit.

Nó có tối thiểu9,223,372,036,854,775,809 và tối đa 9,223,372,036,854,775,807 giá trị.


Chỉ cần thêm Int64kiểu dữ liệu đó có thể được biểu diễn bằng cách sử dụng Lhoặc lhậu tố trong khi Int16hoặc Int32không có hậu tố trong C #.
RBT

14

Theo Jeffrey Richter (một trong những người đóng góp cho phát triển khung .NET) cuốn sách 'CLR qua C #':

int là loại nguyên thủy được trình biên dịch C # cho phép, trong khi Int32 là loại Thư viện lớp khung (có sẵn trên các ngôn ngữ tuân theo CLS). Trong thực tế, int dịch sang Int32 trong quá trình biên dịch.

Cũng thế,

Trong C #, ánh xạ dài tới System.Int64, nhưng trong một ngôn ngữ lập trình khác, dài có thể ánh xạ tới Int16 hoặc Int32. Trong thực tế, C ++ / CLI không coi là Int32.

Trên thực tế, hầu hết các ngôn ngữ (.NET) thậm chí sẽ không coi là một từ khóa và sẽ không biên dịch mã sử dụng nó.

Tôi đã thấy tác giả này, và nhiều tài liệu tiêu chuẩn về .NET thích các loại FCL (tức là Int32) hơn các loại nguyên thủy dành riêng cho ngôn ngữ (ví dụ: int), chủ yếu về các mối quan tâm về khả năng tương tác như vậy.


8

Không có gì. Sự khác biệt duy nhất giữa các loại kích thước của chúng (và do đó, phạm vi của các giá trị mà chúng có thể đại diện).


8

Một lưu ý rất quan trọng về các loại 16, 32 và 64:

nếu bạn chạy truy vấn này ... Array.IndexOf (Int16 mới [] {1,2,3}, 1)

bạn giả sử nhận được số không (0) vì bạn đang hỏi ... là 1 trong mảng 1, 2 hoặc 3. nếu bạn nhận được -1 là câu trả lời, điều đó có nghĩa là 1 không nằm trong mảng 1, 2 hoặc 3 .

Hãy kiểm tra những gì tôi tìm thấy: Tất cả những điều sau đây sẽ cho bạn 0 chứ không phải -1 (Tôi đã thử nghiệm điều này trong tất cả các phiên bản khung 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)

Vì vậy, quan điểm của tôi là, đối với các so sánh Array.IndexOf, chỉ tin tưởng Int32!


7
Để làm rõ lý do tại sao ví dụ đầu tiên hoạt động theo cách đó: nghĩa đen thứ nhất 1, 2 và 3 được đặt ngầm shortđể phù hợp với chúng trong mảng, trong khi nghĩa đen thứ hai là trái như bình thường int. (int)1không được xem là tương đương với (short)1, (short)2, (short)3, do đó kết quả là -1.

4
Có một sự điều chỉnh tương tự có sẵn cho các phiên bản C #, nhưng FYI một công cụ xác định loại đơn giản khắc phục vấn đề này: Array.IndexOf(new Int16(){1,2,3}, 1S) Array.IndexOf(new Int32(){1,2,3}, 1I) Array.IndexOf(new Int64(){1,2,3}, 1L)tất cả đều hoạt động như mong đợi.
Đánh dấu

1
Và những người không làm việc đã sử dụng Object[],Objectquá tải. C # đang ngầm nâng mức intlên longkhi cần thiết (và cũng tăng a shortlên inthoặc long), nhưng sẽ không hoàn toàn bỏ xuống, objectthay vào đó sử dụng quá tải. Với Option Strict Onhoặc OffVB sẽ chỉ sử dụng quá tải gõ khi được cung cấp các loại thống nhất, nếu không, nó sử dụng objectquá tải.
Đánh dấu

Câu trả lời của bạn là sai lệch. Mã này đang so sánh các giá trị của các loại khác nhau. Kết luận for Array.IndexOf comparisons, only trust Int32!là sai. Nếu bạn truyền 1đối số cuối cùng cho loại Mảng tương ứng, nó sẽ hoạt động như mong đợi.
Don Cheadle

Đây là một hành vi rất thú vị và bất ngờ (từ int đến dài hoạt động nhưng ngắn đến int không) do đó upvote!
sth_ Weird

7

EDIT: Điều này không hoàn toàn đúng với C #, một thẻ tôi đã bỏ lỡ khi tôi trả lời câu hỏi này - nếu có câu trả lời cụ thể hơn về C #, thay vào đó hãy bỏ phiếu cho điều đó!


Tất cả đều đại diện cho số nguyên có kích thước khác nhau.

Tuy nhiên, có một sự khác biệt rất nhỏ.

int16, int32 và int64 đều có kích thước cố định .

Kích thước của một int phụ thuộc vào kiến ​​trúc bạn đang biên dịch - thông số C chỉ định nghĩa một int là lớn hơn hoặc bằng một đoạn ngắn mặc dù trong thực tế, đó là chiều rộng của bộ xử lý bạn đang nhắm mục tiêu, có thể là 32 bit nhưng bạn nên biết rằng nó có thể không.


1
Đây phải là câu trả lời được chấp nhận vì đây là câu trả lời duy nhất đúng
mjs

2
Không, điều này không đúng với C #. AC # int luôn có kích thước 32 bit. Đối với C, có, bạn phải xử lý biến chứng này và bạn thường thấy các macro trong mã C để xử lý các kích thước int thay đổi. Xem ecma-i Intl.org/publications/files/ECMA-ST/Ecma-334.pdf trang 18.
Ananke

@Ananke Ahh, đã bỏ lỡ thẻ C #. Ước gì tôi có thể hoàn nguyên một số phiếu về câu trả lời .....
mjs

6
  1. intint32là một và giống nhau (số nguyên 32 bit)
  2. int16 là int ngắn (2 byte hoặc 16 bit)
  3. int64 là kiểu dữ liệu dài (8 byte hoặc 64 bit)

2
int không được đảm bảo là 32 bit.
mjs

8
@mjs, điều này đơn giản là không đúng sự thật. Trong C #, intlà một bí danh Int32và do đó luôn được đảm bảo là 32 bit.
David Arno

Trên thực tế những gì mjs nói là chính xác, INT có nghĩa là số nguyên dựa trên hệ thống x86 hoặc x64, vì vậy nếu hệ thống của bạn là x64, int sẽ là Int64, do đó không được đảm bảo là 32 .. Nếu bạn đặt int32 trong x64 sẽ luôn là int32 .
Yogurtu

5
Không, những gì David Arno nói là chính xác. Ngôn ngữ C # xác định cụ thể 'int' có nghĩa là số nguyên 32 bit (Int32). Các ngôn ngữ khác (C / C ++, v.v.) có thể không chỉ định điều đó, nhưng câu hỏi này được gắn thẻ 'C #'.
Theo Brinkman

@TheoBrinkman Đúng, đây là trang của Microsoft về các loại số nguyên của C #: docs.microsoft.com/en-us/dotnet/csharp/lingu-reference/iêu
Max Barraclough

5

Cả hai thực sự đồng nghĩa với nhau, tuy nhiên tôi tìm thấy sự khác biệt nhỏ giữa chúng,

1) Bạn không thể sử dụng Int32trong khi tạoenum

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

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

2) Int32đi theo khai báo hệ thống. nếu bạn loại bỏ, using.Systembạn sẽ nhận được lỗi biên dịch nhưng không phải trong trường hợpint


-8

Int = Int32 -> Kiểu dài gốc

Int16 -> Bản gốc

Int64 -> Kiểu dữ liệu mới sẽ khả dụng sau các hệ thống 64 bit

"int" chỉ khả dụng cho khả năng tương thích ngược. Chúng ta nên thực sự sử dụng các kiểu int mới để làm cho chương trình của chúng ta chính xác hơn.

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

Một điều nữa tôi nhận thấy trên đường đi là không có lớp nào có tên Inttương tự Int16, Int32 và Int64. Tất cả các hàm hữu ích như TryParsecho số nguyên đến từ Int32.TryParse.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.