อะไรคือความแตกต่างระหว่าง“ int” และ“ uint” /“ long” และ“ ulong”?


คำตอบ:


224

ชนิดข้อมูลดั้งเดิมที่ขึ้นต้นด้วย "u" เป็นเวอร์ชันที่ไม่ได้ลงนามที่มีขนาดบิตเดียวกัน อย่างมีประสิทธิภาพหมายความว่าพวกเขาไม่สามารถจัดเก็บตัวเลขเชิงลบได้ แต่ในทางกลับกันพวกเขาสามารถจัดเก็บจำนวนบวกที่มีขนาดใหญ่เป็นสองเท่าของคู่ที่ลงนาม คู่สัญญาที่ลงนามไม่มีคำนำหน้า "u"

ขีด จำกัด สำหรับ int (32 บิต) คือ:

int: 2147483648 to 2147483647 
uint: 0 to 4294967295 

และนาน (64 บิต):

long: -9223372036854775808 to 9223372036854775807
ulong: 0 to 18446744073709551615

12
นี่เป็นเรื่องสนุกมากที่ได้ทำงานด้วยมือ ตัวแปรที่ลงนาม 32 บิตใช้ 1 บิตสำหรับเครื่องหมาย (บวกหรือลบ) จึงสามารถเก็บค่าระหว่าง -2 ^ 31 และ + 2 ^ 31 - 1
Jaco Pretorius

เมื่อเปรียบเทียบ int และ uint สำหรับการใช้งานข้อใดเป็นไปได้
อรุณ

เทียบเท่า c ++ คืออะไร
darkgaze

1
@JacoPretorius นั่นผิด int 8 บิตมีช่วงตั้งแต่ –128 ถึง 127 บิตที่ 9 แทนค่า 256 ดังนั้นด้วย 8 บิตคุณสามารถแทนค่าทั้งหมดได้ถึง 255 (ค่าที่ 9 - 1) ช่วงตั้งแต่ -128 ถึง 127 มีความยาว 255 พอดีดังนั้นจึงไม่มีบิตที่ถือเครื่องหมาย ค่าทั้งหมดสูงถึง 127 เป็นค่าบวก ค่าข้างต้นจะแสดงเป็นลบ 255 จะเป็น -1 254 จะเป็น -2 และทางเดียวลงไปที่ 128
C4d

ฉันคิดว่าเป็นที่น่าสังเกตว่าโดยเฉพาะสำหรับ int vs uint จำนวนเต็มที่ไม่ได้ลงชื่อนั้นไม่สอดคล้องกับ CLS และขอแนะนำให้ใช้ int ให้บ่อยที่สุด
db2

38

uintและulongเป็นเวอร์ชันที่ไม่ได้ลงนามของintและlong. นั่นหมายความว่าพวกเขาไม่สามารถติดลบได้ แต่จะมีค่าสูงสุดที่มากกว่า

พิมพ์ Min Max ตามมาตรฐาน CLS
int -2,147,483,648 2,147,483,647 ใช่
uint 0 4,294,967,295 เลขที่
long –9,223,372,036,854,775,808 9,223,372,036,854,775,807 ใช่
อู่หลง 0 18,446,744,073,709,551,615 เลขที่

การเขียนตัวอักษร int ไม่ได้ลงนามในรหัสที่มาของคุณคุณสามารถใช้ต่อท้ายuหรือยกตัวอย่างเช่นU123U

คุณไม่ควรใช้ UINT และอู่ล่องในอินเตอร์เฟซที่สาธารณะของคุณถ้าคุณต้องการที่จะเป็นCLS ได้มาตรฐาน

อ่านเอกสารสำหรับข้อมูลเพิ่มเติม:

โดยวิธีการที่ยังมีระยะสั้นและushortและไบต์และsbyte


สิ่งนี้น่าสนใจ - คุณหมายถึงอะไรเกี่ยวกับการปฏิบัติตาม CLS ลิงก์ไปที่เอกสาร MSDN สำหรับ int ถ้าตาม "CLS" คุณหมายถึงสเป็คภาษา C # ฉันก็ไม่เข้าใจ - ข้อมูลจำเพาะอธิบายทั้ง uint และ ulong อย่างชัดเจน (หัวข้อ 1.3)
Isak Savo

1
@Isak Savo: สิ่งสำคัญคือต้องสอดคล้องกับ CLS หากคุณกำลังเขียนอินเทอร์เฟซที่สามารถใช้กับภาษา. NET อื่นที่ไม่ใช่ภาษา C #
Mark Byers

อยากรู้ว่าคุณพูดถึงสั้นและใช้งานไม่ได้ แต่เว้นไบต์และ sbyte ไว้ :)
Roman Starkov

10

uวิธีการunsignedเพื่อให้ulongเป็นจำนวนมากโดยไม่ต้องเข้าสู่ระบบ คุณสามารถจัดเก็บค่าที่ใหญ่ulongกว่าlongได้ แต่ไม่อนุญาตให้ใช้ตัวเลขเชิงลบ

longค่าถูกเก็บไว้ใน 64 บิตกับหลักแรกที่จะแสดงให้เห็นว่าเป็น / จำนวนลบเป็นบวก ในขณะที่ulongยังเป็น 64 บิตด้วย 64 บิตทั้งหมดเพื่อจัดเก็บหมายเลข ดังนั้นค่าสูงสุดของ ulong คือ 2 (64) -1 ในขณะที่ long คือ 2 (63) -1


9

ความแตกต่างคือชนิดข้อมูลที่ไม่ได้ลงชื่อuintและulongไม่ได้ลงนามซึ่งหมายความว่าช่วงนั้นแตกต่างกันพวกเขาไม่ยอมรับค่าลบ:

int range: -2,147,483,648 to 2,147,483,647
uint range: 0 to 4,294,967,295

long range: 9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
ulong range: 0 to 18,446,744,073,709,551,615

0

เป็นเวลานานแล้วที่ฉัน C ++ แต่คำตอบเหล่านี้ไม่ชัดเจน

เท่าที่ขนาดไป 'int' ไม่ใช่อะไร มันเป็นค่าสัญกรณ์ของจำนวนเต็มมาตรฐาน ถือว่าเร็วสำหรับวัตถุประสงค์ของสิ่งต่างๆเช่นการทำซ้ำ มันไม่มีขนาดที่ตั้งไว้ล่วงหน้า

ดังนั้นคำตอบจึงถูกต้องตามความแตกต่างระหว่าง int และ uint แต่จะไม่ถูกต้องเมื่อพูดถึง "ขนาดใหญ่แค่ไหน" หรือช่วงของมันคืออะไร ขนาดนั้นไม่ได้กำหนดหรือถูกต้องมากขึ้นก็จะเปลี่ยนไปตามคอมไพเลอร์และแพลตฟอร์ม

การพูดคุยเกี่ยวกับขนาดของบิตในที่สาธารณะไม่สุภาพ

เมื่อคุณคอมไพล์โปรแกรม int จะมีขนาดตามที่คุณได้ใช้นามธรรม C / C ++ และเปลี่ยนเป็นรหัสเครื่องจักรที่เป็นรูปธรรม

ดังนั้นวันนี้พูดกับคอมไพเลอร์ทั่วไปส่วนใหญ่ถูกต้อง แต่อย่าถือว่าสิ่งนี้

โดยเฉพาะ: หากคุณกำลังเขียนโปรแกรม 32 บิต int จะเป็นอย่างหนึ่ง 64 บิตอาจแตกต่างกันและ 16 บิตก็แตกต่างกัน ฉันได้ดูทั้งสามและสั้น ๆ ที่ 6502 shudder

การค้นหาโดย Google สั้น ๆ แสดงสิ่งนี้: https://www.tutorialspoint.com/cprogramming/c_data_types.htm นี่เป็นข้อมูลที่ดีเช่นกัน: https://docs.oracle.com/cd/E19620-01/805-3024/lp64- 1 / index.html

ใช้ int ถ้าคุณไม่สนใจว่าบิตของคุณมีขนาดใหญ่แค่ไหน มันสามารถเปลี่ยนแปลงได้

ใช้ size_t และ ssize_t หากคุณต้องการทราบว่าสิ่งของมีขนาดใหญ่เพียงใด

หากคุณกำลังอ่านหรือเขียนข้อมูลไบนารีอย่าใช้ int ใช้คีย์เวิร์ดเฉพาะ (โดยปกติจะขึ้นอยู่กับแพลตฟอร์ม / แหล่งที่มา) WinSDK มีตัวอย่างที่ดีและดูแลรักษาได้มากมาย แพลตฟอร์มอื่น ๆ ก็ทำเช่นกัน

ฉันใช้เวลามากมายในการอ่านโค้ดจากคนที่ "SMH" ด้วยความคิดที่ว่าทั้งหมดนี้เป็นแค่วิชาการ / อวดรู้ พวกนี้กินคนที่เขียนโค้ดที่ไม่สามารถเข้าถึงได้ แน่นอนว่ามันง่ายที่จะใช้ประเภท 'int' และใช้งานได้โดยไม่ต้องพิมพ์อะไรเพิ่มเติม เป็นเรื่องที่ต้องทำหลายอย่างเพื่อค้นหาว่าสิ่งที่พวกเขาหมายถึงจริงๆคืออะไรและทำให้มึนงง

มันเป็นการเข้ารหัสที่เส็งเคร็งเมื่อคุณผสม int

ใช้ int และ uint เมื่อคุณต้องการจำนวนเต็มอย่างรวดเร็วและไม่สนใจช่วง (นอกเหนือจากที่ลงชื่อ / ไม่ได้ลงนาม)

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