ความแตกต่างระหว่างคืออะไร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 ในคำตอบของเขา :
int
และInt32
มีความหมายเหมือนกัน;int
จะดูคุ้นเคยเล็กน้อยยิ่งขึ้นInt32
ทำให้พยาน 32 คนชัดเจนมากขึ้นสำหรับผู้อ่านรหัสของคุณ ฉันอยากจะใช้ int ที่ฉันต้องการ 'จำนวนเต็ม'Int32
ซึ่งขนาดนั้นสำคัญ (รหัสการเข้ารหัสโครงสร้าง) ดังนั้นผู้ดูแลในอนาคตจะรู้ว่ามันปลอดภัยที่จะขยายint
ถ้าเหมาะสม แต่ควรดูแลการเปลี่ยนแปลงInt32
ตัวแปรที่ในลักษณะเดียวกัน .รหัสผลลัพธ์จะเหมือนกัน: ความแตกต่างเป็นเพียงหนึ่งในการอ่านหรือการปรากฏตัวของรหัส
int
เป็นเสมอ Int32
โดยไม่คำนึงถึงระบบ บางทีคุณคิดว่า C ++?
ความแตกต่างที่แท้จริงเท่านั้นที่นี่คือขนาด ชนิด int ทั้งหมดในที่นี้เป็นค่าจำนวนเต็มที่ลงนามซึ่งมีขนาดแตกต่างกัน
Int16
: 2 ไบต์Int32
และint
: 4 ไบต์Int64
: 8 ไบต์มีความแตกต่างเล็ก ๆ น้อย ๆ ระหว่างInt64
กับส่วนที่เหลือ ในการกำหนดแพลตฟอร์ม 32 บิตไปยังที่Int64
เก็บข้อมูลไม่รับประกันว่าจะเป็นแบบอะตอมมิก รับประกันทุกประเภทอื่น ๆ
Int64
ใน32 bit Windows Operating System
แล้วสิ่งที่เป็นปัญหาที่ผมอาจต้องเผชิญ? มีตัวอย่างอะไรบ้าง?
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 #
ตาม 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) ซึ่งส่วนใหญ่เกี่ยวกับความกังวลในการใช้งานร่วมกัน
ไม่มีอะไร ความแตกต่างเพียงอย่างเดียวระหว่างประเภทคือขนาด (และดังนั้นช่วงของค่าที่สามารถแสดงได้)
หมายเหตุสำคัญมากสำหรับประเภท 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!
short
เพื่อให้พอดีกับพวกมันในอาเร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 ที่เกี่ยวข้องจะทำงานได้ตามที่คาดไว้
แก้ไข: นี่ไม่เป็นความจริงสำหรับ C #, แท็กที่ฉันพลาดเมื่อฉันตอบคำถามนี้ - หากมีคำตอบเฉพาะ C # เพิ่มเติมโปรดลงคะแนนให้แทน!
พวกมันทั้งหมดแสดงถึงจำนวนเต็มที่มีขนาดแตกต่างกัน
อย่างไรก็ตามมีความแตกต่างเล็กน้อยมาก
int16, int32 และ int64 ทั้งหมดมีขนาดคงที่
ขนาดของ int ขึ้นอยู่กับสถาปัตยกรรมที่คุณกำลังรวบรวม - สเปค C กำหนดเพียง int ว่าใหญ่กว่าหรือเท่ากับสั้น แต่ในทางปฏิบัติความกว้างของโปรเซสเซอร์ที่คุณกำหนดเป้าหมายซึ่งน่าจะเป็น 32 บิต แต่คุณควรรู้ มันอาจจะไม่
int
และint32
เป็นหนึ่งและเหมือนกัน (จำนวนเต็ม 32- บิต)int16
สั้น int (2 ไบต์หรือ 16 บิต)int64
ประเภทข้อมูลที่มีความยาว (8 ไบต์หรือ 64 บิต)int
หมายถึงนามแฝงInt32
และรับประกันว่าจะเป็น 32 บิตเสมอ
พวกเขาทั้งคู่มีความหมายเหมือนกันอย่างไรก็ตามฉันพบความแตกต่างเล็กน้อยระหว่างพวกเขา
1) คุณไม่สามารถใช้Int32
ในขณะที่สร้างenum
enum Test : Int32
{ XXX = 1 // gives you compilation error
}
enum Test : int
{ XXX = 1 // Works fine
}
2) Int32
อยู่ภายใต้การประกาศของระบบ หากคุณลบusing.System
คุณจะได้รับข้อผิดพลาดในการรวบรวม แต่ไม่ใช่ในกรณีของint
Int = Int32 -> แบบยาวดั้งเดิม
Int16 -> ค่าเริ่มต้นดั้งเดิม
Int64 -> ชนิดข้อมูลใหม่พร้อมใช้งานหลังจากระบบ 64 บิต
"int" พร้อมใช้งานสำหรับความเข้ากันได้แบบย้อนหลังเท่านั้น เราควรใช้ int ประเภทใหม่เพื่อให้โปรแกรมของเราแม่นยำยิ่งขึ้น
---------------
อีกสิ่งหนึ่งที่ฉันสังเกตได้ระหว่างทางคือไม่มีคลาสชื่อInt
คล้ายกับ Int16, Int32 และ Int64 ทุกฟังก์ชั่นที่เป็นประโยชน์เช่นสำหรับจำนวนเต็มมาจากTryParse
Int32.TryParse
int16
การประหยัดทรัพยากรหน่วยความจำเมื่อเทียบกับเพียงแค่ใช้int
?