ประเภทข้อมูลที่ไม่ได้ลงชื่อคืออะไร


93

ฉันเคยเห็นunsignedประเภท "ไร้ประเภท" นี้มาแล้วสองสามครั้ง แต่ไม่เคยเห็นคำอธิบาย ฉันคิดว่ามีsignedประเภทที่เกี่ยวข้อง นี่คือตัวอย่าง:

สิ่งที่ฉันรวบรวมมาจนถึงตอนนี้:
- ในระบบของฉันsizeof(unsigned) = 4(บอกใบ้ int ที่ไม่ได้ลงนาม 32 บิต)
- อาจใช้เป็นชวเลขในการแคสต์ประเภทอื่นไปยังเวอร์ชันที่ไม่ได้ลงชื่อ:

นี่คือ ANSI C หรือเป็นเพียงส่วนขยายของคอมไพเลอร์?

คำตอบ:



32

unsignedหมายถึงunsigned int. signedหมายถึงsigned int. การใช้ just unsignedเป็นวิธีที่ขี้เกียจในการประกาศunsigned intใน C ใช่นี่คือ ANSI


15

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


6
ฉันไม่รู้ว่ามันเป็นการปฏิบัติที่ไม่ดี มีเหตุผลสำหรับเรื่องนี้หรือไม่? longแทนที่จะlong intเป็นเรื่องธรรมดามากดังนั้นฉันไม่แน่ใจว่าทำไมunsignedแทนที่จะunsigned intเป็นที่ยอมรับไม่ได้
CB Bailey

10
@ ชาร์ลส์เบลีย์: วันนี้ - อย่างน้อยถ้าคุณใช้งานได้จริงแทนที่จะเป็นทางการ - long, int, short และ char ถือว่าเป็นประเภทข้อมูลที่แตกต่างกันเนื่องจากอาจมีขนาดแตกต่างกัน) โดยไม่ได้ลงนาม (และค่าเริ่มต้นลงนาม) เป็น a รอบคัดเลือก. ดังนั้นคุณมักจะใช้ "int ที่ไม่ได้ลงชื่อ" ในลักษณะเดียวกับที่คุณใช้ "unsigned long" หรือ "ถ่านที่ไม่ได้ลงชื่อ" (และทำให้ชัดเจนว่าคุณไม่ได้พลาดเพียงแค่ int) int ใน "long int" หรือ "short int" นั้นไม่จำเป็น
Dipstick

1
@Dipstick "long" คือคุณสมบัติของ "int" ดูเหมือนว่า int ใน "int ที่ไม่ได้ลงนาม" จะไม่จำเป็นพอ ๆ กับ int ใน "int ยาวที่ไม่ได้ลงนาม"
Conrad Meyer

1
ซึ่งไม่เหมือนกับกฎ "int" โดยปริยาย คำตอบนี้ทำให้เข้าใจผิด

8

ใน C, เป็นทางลัดสำหรับunsignedunsigned int

คุณมีเหมือนกันสำหรับlongที่เป็นทางลัดสำหรับlong int

และยังสามารถประกาศ a unsigned long(จะเป็น a unsigned long int) ได้อีกด้วย

สิ่งนี้อยู่ในมาตรฐาน ANSI


ใช่. unsignedเหมือนกับunsigned intแต่ฉันได้ค้นหาในWG14 / N1124 Committee Draft - 6 พฤษภาคม 2548 ISO / IEC 9899: TC2สำหรับunsignedและไม่พบว่ามีการกำหนดไว้ที่ใด ... คุณสามารถอ้างอิงส่วนที่กำหนดได้หรือไม่?
user454322

5

ใน C และ C ++

จำนวนเต็มที่ไม่ได้ลงชื่อที่มี n บิตสามารถมีค่าระหว่าง 0 ถึง (2 ^ n-1) ซึ่งเป็นค่าที่แตกต่างกัน 2 ^ n

จำนวนเต็มที่ไม่ได้ลงชื่อจะเป็นบวกหรือศูนย์

จำนวนเต็มที่ลงชื่อจะถูกเก็บไว้ในคอมพิวเตอร์โดยใช้ส่วนเติมเต็ม 2


2

ตาม C17 6.7.2 §2:

รายการตัวระบุประเภทแต่ละรายการจะต้องเป็นชุดหลายชุดต่อไปนี้ (คั่นด้วยลูกน้ำเมื่อมีชุดมากกว่าหนึ่งชุดต่อรายการ) ตัวระบุประเภทอาจเกิดขึ้นในลำดับใด ๆ อาจผสมกับตัวระบุการประกาศอื่น ๆ

- โมฆะ
- ถ่าน - ถ่านที่
ลงนาม - ถ่านที่
ไม่ได้ลงนาม
- สั้นลงนามสั้น int สั้นหรือลงนามสั้น int
- สั้นที่ไม่ได้ลงนามหรือ int สั้นที่ไม่ได้ลงนาม
- int ลงนามหรือลงนาม int
- ไม่ได้ลงนามหรือไม่ได้ลงนาม int
- ยาวลงนามยาว , int ยาวหรือลงนาม long int
- ไม่ได้ลงนามยาวหรือไม่ได้ลงนาม long int
- ยาวยาวลงนามยาวยาว int ยาวหรือลงนามยาว int
- ยาวไม่ได้ลงนามยาวยาวหรือไม่ได้ลงนามยาว int
- ลอย
- คู่
- คู่ยาว
- _Bool
- float _Complex
- double _Complex
- long double _Complex
- ตัวระบุประเภทอะตอม
- ตัวระบุโครงสร้างหรือสหภาพ
- ตัวระบุ enum
- ชื่อ typedef

ดังนั้นในกรณีของunsigned intเราสามารถเขียนunsignedหรือหรือถ้าเรามีความรู้สึกบ้าunsigned int int unsignedหลังเนื่องจากมาตรฐานนั้นโง่พอที่จะอนุญาตให้ "... อาจเกิดขึ้นในลำดับใด ๆ อาจผสมกัน" นี่เป็นข้อบกพร่องที่ทราบกันดีของภาษา

unsigned intที่เหมาะสมใช้รหัส C


1

นำฉันคำตอบจากคำถามอื่น

จากข้อกำหนด Cส่วน 6.7.2:

- int ที่ไม่ได้ลงนามหรือไม่ได้ลงนาม

หมายความว่าunsignedเมื่อไม่ได้ระบุประเภทค่าเริ่มต้นจะ unsigned intเป็น ดังนั้นการเขียนเป็นเช่นเดียวกับunsigned aunsigned int a

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