Sự khác nhau giữa là gì int
, System.Int16
, System.Int32
và System.Int64
khác hơn so với kích thước của chúng?
Sự khác nhau giữa là gì int
, System.Int16
, System.Int32
và System.Int64
khác hơn so với kích thước của chúng?
Câu trả lời:
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 :
int
vàInt32
thực sự là đồng nghĩa;int
sẽ trông quen thuộc hơn một chút,Int32
là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',Int32
trong đó 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 toint
nếu phù hợp, nhưng nên cẩn thận thay đổiInt32
cá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ã.
int
là luôn luôn Int32
, bất kể hệ thống. Có lẽ bạn đang nghĩ về C ++?
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 byteInt32
và int
: 4 byteInt64
: 8 byteCó một sự khác biệt nhỏ giữa Int64
và phần còn lại. Trên các bài tập nền tảng 32 bit cho một Int64
vị 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.
Int64
trong 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?
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ị.
Int64
kiểu dữ liệu đó có thể được biểu diễn bằng cách sử dụng L
hoặc l
hậu tố trong khi Int16
hoặc Int32
không có hậu tố trong C #.
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.
Không có gì. Sự khác biệt duy nhất giữa các loại là 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).
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!
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)1
không được xem là tương đương với (short)1
, (short)2
, (short)3
, do đó kết quả là -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)
tất cả đều hoạt động như mong đợi.
Object[],Object
quá tải. C # đang ngầm nâng mức int
lên long
khi cần thiết (và cũng tăng a short
lên int
hoặc long
), nhưng sẽ không hoàn toàn bỏ xuống, object
thay vào đó sử dụng quá tải. Với Option Strict On
hoặc Off
VB 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 object
quá tải.
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.
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.
int
và int32
là một và giống nhau (số nguyên 32 bit)int16
là int ngắn (2 byte hoặc 16 bit)int64
là kiểu dữ liệu dài (8 byte hoặc 64 bit)int
là một bí danh Int32
và do đó luôn được đảm bảo là 32 bit.
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 Int32
trong 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.System
bạn sẽ nhận được lỗi biên dịch nhưng không phải trong trường hợpint
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 Int
tương tự Int16, Int32 và Int64. Tất cả các hàm hữu ích như TryParse
cho số nguyên đến từ Int32.TryParse
.
int16
để lưu tài nguyên bộ nhớ, trái ngược với việc sử dụng đơn giảnint
?