ความแตกต่างระหว่าง int, Int16, Int32 และ Int64 คืออะไร?


229

ความแตกต่างระหว่างคืออะไรint, System.Int16, System.Int32และSystem.Int64อื่น ๆ กว่าขนาดของพวกเขา?

คำตอบ:


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 คนชัดเจนมากขึ้นสำหรับผู้อ่านรหัสของคุณ ฉันอยากจะใช้ int ที่ฉันต้องการ 'จำนวนเต็ม' Int32ซึ่งขนาดนั้นสำคัญ (รหัสการเข้ารหัสโครงสร้าง) ดังนั้นผู้ดูแลในอนาคตจะรู้ว่ามันปลอดภัยที่จะขยาย intถ้าเหมาะสม แต่ควรดูแลการเปลี่ยนแปลงInt32ตัวแปรที่ในลักษณะเดียวกัน .

รหัสผลลัพธ์จะเหมือนกัน: ความแตกต่างเป็นเพียงหนึ่งในการอ่านหรือการปรากฏตัวของรหัส


1
ถ้าคุณรู้ว่าค่าจะไม่ได้ไปจะเกิน 65,535 (ลงนาม) หรือ -32,768 ไป 32,767 (ไม่ได้ลงนาม) มันจะไม่ดีกว่าที่จะกำหนดจำนวนเต็มเช่นint16การประหยัดทรัพยากรหน่วยความจำเมื่อเทียบกับเพียงแค่ใช้int?
ᴍᴀᴛᴛʙᴀᴋᴇʀ

8
int และ int32 สามารถตรงกัน แต่พวกเขาไม่จำเป็นต้อง ปัจจุบันระบบส่วนใหญ่ที่ขายเป็น 64 บิตซึ่งในกรณีนี้ int จะเป็น 64 บิต
Martijn Otto

4
สำหรับ Matthew T. Baker และคนอื่น ๆ เช่นฉันที่มาที่นี่เพื่อพยายามตัดสินใจว่าจะใช้จุดยืนด้านประสิทธิภาพอย่างไรคุณควรตรวจสอบโพสต์นี้ที่แนะนำ Integer มีประสิทธิภาพมากกว่า Int16 ในหลาย ๆ กรณี: stackoverflow.com/questions/129023/ net-integer-vs-int16
Tony L.

19
@MartijnOtto คำถามถูกติดแท็ก C # ใน C #, intเป็นเสมอ Int32โดยไม่คำนึงถึงระบบ บางทีคุณคิดว่า C ++?

9
@MattBaker: โดยทั่วไปแล้วในคอมพิวเตอร์สมัยใหม่นั้น int16 ใช้พื้นที่มากพอ ๆ กับ int32 (และที่จริงแล้วเป็น int64) เพราะเพื่อให้การดำเนินงานส่วนใหญ่มีประสิทธิภาพเราวางข้อมูลไว้รอบ ๆ เพื่อให้การเข้าถึงสอดคล้องกับขอบเขต 32 หรือ 64 บิต (ในโหมด 32 หรือ 64 บิตตามลำดับ) นี่เป็นเพราะการเข้าถึงที่ไม่ได้แนวนั้นไม่มีประสิทธิภาพในบางสถาปัตยกรรมและเป็นไปไม่ได้ที่คนอื่น ๆ จะทำได้
Joel

118

ความแตกต่างที่แท้จริงเท่านั้นที่นี่คือขนาด ชนิด int ทั้งหมดในที่นี้เป็นค่าจำนวนเต็มที่ลงนามซึ่งมีขนาดแตกต่างกัน

  • Int16: 2 ไบต์
  • Int32และint: 4 ไบต์
  • Int64 : 8 ไบต์

มีความแตกต่างเล็ก ๆ น้อย ๆ ระหว่างInt64กับส่วนที่เหลือ ในการกำหนดแพลตฟอร์ม 32 บิตไปยังที่Int64เก็บข้อมูลไม่รับประกันว่าจะเป็นแบบอะตอมมิก รับประกันทุกประเภทอื่น ๆ


หากฉันใช้Int64ใน32 bit Windows Operating Systemแล้วสิ่งที่เป็นปัญหาที่ผมอาจต้องเผชิญ? มีตัวอย่างอะไรบ้าง?
shaijut

70

int

มันเป็นชนิดข้อมูลดั้งเดิมที่กำหนดไว้ใน C #

มันถูกแมปกับ Int32 ของประเภท FCL

มันเป็นประเภทค่าและเป็นตัวแทนของ System.Int32 struct

มีการเซ็นชื่อและใช้เวลา 32 บิต

มีค่าต่ำสุด -2147483648 และค่าสูงสุด +2147483647

Int16

มันเป็นประเภท FCL

ใน C # ย่อแมปกับ Int16

มันเป็นประเภทค่าและเป็นตัวแทนของ System.Int16 struct

มีการเซ็นชื่อและใช้เวลา 16 บิต

มีค่าต่ำสุด -32768 และค่าสูงสุด +32767

Int32

มันเป็นประเภท FCL

ใน C #, intถูกจับคู่กับ Int32

มันเป็นประเภทค่าและเป็นตัวแทนของ System.Int32 struct

มีการเซ็นชื่อและใช้เวลา 32 บิต

มีค่าต่ำสุด -2147483648 และค่าสูงสุด +2147483647

Int64

มันเป็นประเภท FCL

ใน C # ยาวถูกแมปกับ Int64

มันเป็นประเภทค่าและเป็นตัวแทนของ System.Int64 struct

มีการเซ็นชื่อและใช้เวลา 64 บิต

มีค่าต่ำสุด –9,223,372,036,854,775,808 และค่าสูงสุด 9,223,372,036,854,775,807 ขั้นต่ำ


เพียงแค่เพิ่มInt64ประเภทข้อมูลที่สามารถแสดงโดยใช้Lหรือlต่อท้ายในขณะที่Int16หรือInt32ไม่ได้ต่อท้ายใน C #
RBT

14

ตาม Jeffrey Richter (หนึ่งในผู้สนับสนุนการพัฒนา. NET Framework) ของหนังสือ 'CLR ผ่าน C #':

int เป็นชนิดดั้งเดิมที่อนุญาตโดยคอมไพเลอร์ C # ในขณะที่ Int32 เป็นประเภท Framework Class Library (มีให้ในทุกภาษาที่ปฏิบัติตาม CLS) ในความเป็นจริง int แปลเป็น Int32 ในระหว่างการรวบรวม

นอกจากนี้

ใน C # แผนที่ยาวกับ System.Int64 แต่ในภาษาการเขียนโปรแกรมที่แตกต่างกันยาวสามารถแมปไปที่ Int16 หรือ Int32 ในความเป็นจริง C ++ / CLI จะปฏิบัติต่อตราบเท่าที่ Int32

ในความเป็นจริงภาษา (. NET) ส่วนใหญ่จะไม่ได้ใช้คำหลักและจะไม่คอมไพล์รหัสที่ใช้

ฉันได้เห็นผู้เขียนคนนี้และวรรณกรรมมาตรฐานจำนวนมากบน. NET เลือกประเภท FCL (เช่น Int32) กับประเภทดั้งเดิมเฉพาะภาษา (เช่น int) ซึ่งส่วนใหญ่เกี่ยวกับความกังวลในการใช้งานร่วมกัน


8

ไม่มีอะไร ความแตกต่างเพียงอย่างเดียวระหว่างประเภทคือขนาด (และดังนั้นช่วงของค่าที่สามารถแสดงได้)


8

หมายเหตุสำคัญมากสำหรับประเภท 16, 32 และ 64:

ถ้าคุณเรียกใช้คิวรีนี้ ... Array.IndexOf (Int16 ใหม่ [] {1,2,3}, 1)

คุณคาดว่าจะได้ศูนย์ (0) เพราะคุณกำลังขอให้ ... คือ 1 ภายในอาร์เรย์ของ 1, 2 หรือ 3 ถ้าคุณได้รับ -1 เป็นคำตอบหมายความว่า 1 ไม่อยู่ในอาร์เรย์ของ 1, 2 หรือ 3 .

ตรวจสอบสิ่งที่ฉันพบ: ทั้งหมดต่อไปนี้ควรให้ 0 และไม่ใช่ -1 (ฉันได้ทดสอบสิ่งนี้ในเฟรมเวิร์กเวอร์ชัน 2.0, 3.0, 3.5, 4.0)

ค#:

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เพื่อให้พอดีกับพวกมันในอาเร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

1
และสิ่งที่ไม่ทำงานได้ใช้งานObject[],Objectเกินพิกัด C # โดยปริยายยกintไปlongเมื่อมีความจำเป็น (และยังยกshortไปยังintหรือlong) แต่จะไม่ทิ้งลงโดยปริยายใช้objectเกินแทน ด้วยOption Strict OnหรือOffVB จะใช้โอเวอร์โหลดที่พิมพ์เมื่อจัดเตรียมประเภทชุดมิฉะนั้นจะใช้objectโอเวอร์โหลด
Mark Hurd

คำตอบของคุณทำให้เข้าใจผิด รหัสคือการเปรียบเทียบค่าประเภทต่าง ๆ บทสรุปfor Array.IndexOf comparisons, only trust Int32!นั้นผิด หากคุณส่ง1อาร์กิวเมนต์สุดท้ายไปยังประเภท Array ที่เกี่ยวข้องจะทำงานได้ตามที่คาดไว้
Don Cheadle

นี่เป็นพฤติกรรมที่น่าสนใจและคาดไม่ถึง (ตั้งแต่ int ถึง long works แต่ short to int ไม่ได้) ดังนั้น upvote!
sth_Weird

7

แก้ไข: นี่ไม่เป็นความจริงสำหรับ C #, แท็กที่ฉันพลาดเมื่อฉันตอบคำถามนี้ - หากมีคำตอบเฉพาะ C # เพิ่มเติมโปรดลงคะแนนให้แทน!


พวกมันทั้งหมดแสดงถึงจำนวนเต็มที่มีขนาดแตกต่างกัน

อย่างไรก็ตามมีความแตกต่างเล็กน้อยมาก

int16, int32 และ int64 ทั้งหมดมีขนาดคงที่

ขนาดของ int ขึ้นอยู่กับสถาปัตยกรรมที่คุณกำลังรวบรวม - สเปค C กำหนดเพียง int ว่าใหญ่กว่าหรือเท่ากับสั้น แต่ในทางปฏิบัติความกว้างของโปรเซสเซอร์ที่คุณกำหนดเป้าหมายซึ่งน่าจะเป็น 32 บิต แต่คุณควรรู้ มันอาจจะไม่


1
นี่ควรเป็นคำตอบที่ยอมรับได้เนื่องจากนี่เป็นคำตอบเดียวที่ถูกต้องจริง
mjs

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 สั้น int (2 ไบต์หรือ 16 บิต)
  3. int64 ประเภทข้อมูลที่มีความยาว (8 ไบต์หรือ 64 บิต)

2
int ไม่รับประกันว่าจะเป็น 32 บิต
mjs

8
@mjs นี่ไม่เป็นความจริงเลย ใน C # intหมายถึงนามแฝงInt32และรับประกันว่าจะเป็น 32 บิตเสมอ
David Arno

จริงๆแล้วสิ่งที่ mjs พูดถูกต้อง INT หมายถึงจำนวนเต็มตามระบบ x86 หรือ x64 ดังนั้นหากระบบของคุณคือ x64 int จะเป็น Int64 ดังนั้นจึงไม่รับประกันว่าจะเป็น 32 .. หากคุณใส่ int32 ใน x64 จะเป็น int32 เสมอ .
Yogurtu

5
ไม่สิ่งที่ David Arno พูดถูกต้อง ภาษา C # กำหนด 'int' เป็นค่าเฉลี่ยจำนวนเต็ม 32 บิต (Int32) ภาษาอื่น ๆ (C / C ++ ฯลฯ ) อาจไม่ได้ระบุไว้ แต่คำถามนี้ถูกแท็ก 'C #'
Theo Brinkman

@ TheoBrinkman ถูกต้องนี่คือหน้าของ Microsoft ในประเภทตัวเลขหนึ่งของ C #: docs.microsoft.com/en-us/dotnet/csharp/language-reference/ …
Max Barraclough

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 -> ค่าเริ่มต้นดั้งเดิม

Int64 -> ชนิดข้อมูลใหม่พร้อมใช้งานหลังจากระบบ 64 บิต

"int" พร้อมใช้งานสำหรับความเข้ากันได้แบบย้อนหลังเท่านั้น เราควรใช้ int ประเภทใหม่เพื่อให้โปรแกรมของเราแม่นยำยิ่งขึ้น

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

อีกสิ่งหนึ่งที่ฉันสังเกตได้ระหว่างทางคือไม่มีคลาสชื่อIntคล้ายกับ Int16, Int32 และ Int64 ทุกฟังก์ชั่นที่เป็นประโยชน์เช่นสำหรับจำนวนเต็มมาจากTryParseInt32.TryParse

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.