คำหลักที่ไม่ได้ลงนามใน C ++


88

คำหลักที่ไม่ได้ลงชื่อเริ่มต้นเป็นชนิดข้อมูลเฉพาะใน C ++ หรือไม่ ฉันกำลังพยายามเขียนฟังก์ชันสำหรับคลาสสำหรับต้นแบบ:

unsigned Rotate(unsigned object, int count)

แต่ฉันไม่เข้าใจความunsignedหมายจริงๆ มันไม่ควรเหมือนunsigned intหรืออะไร?

คำตอบ:


93

จากลิงค์ด้านบน:

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

ซึ่งหมายความว่าคุณสามารถสมมติว่าผู้แต่งกำลังใช้ ints


C99 และ MISRA อนุญาตให้ทำได้หรือไม่?
nowox

42

ประเภทจำนวนเต็ม:

short            -> signed short
signed short
unsigned short
int              -> signed int
signed int
unsigned int
signed           -> signed int
unsigned         -> unsigned int
long             -> signed long
signed long
unsigned long

ระวังถ่าน:

char  (is signed or unsigned depending on the implmentation)
signed char
unsigned char

1
@ Firas: ฉันรู้ว่ามันอยู่ใน C Implicit int ไม่ใช่ส่วนหนึ่งของ ISO C99 หรือเป็นส่วนหนึ่งของ ISO C ++
Prasoon Saurav

4
การใช้ 'ไม่ได้ลงนาม' (โดยตัวมันเอง) เพื่อประกาศว่าประเภท 'int ที่ไม่ได้ลงนาม' เป็นมาตรฐานใน C ++ ในมาตรฐานปัจจุบัน: 7.1.5.2 [dcl.simple.type] มีตารางที่ระบุการประกาศแต่ละประเภทเป็นประเภทจริงที่ใช้ ตารางนั้นมีการติดต่อกันจากการประกาศ 'ไม่ได้ลงนาม' เป็น 'int ที่ไม่ได้ลงนาม'
David Rodríguez - น้ำลายไหล

2
โปรดสังเกตว่า char มีลักษณะการทำงานเหมือนกันกับ char ที่ลงชื่อหรือ char ที่ไม่ได้ลงชื่อ แต่ยังคงเป็นประเภทที่แยกจากกันไม่ว่าจะเกิดอะไรขึ้นก็ตาม

@ ไฟเบอร์: ดูหัวข้อ: 3.9.1 ประเภทพื้นฐาน Paragrah 2: <quote> มีประเภทจำนวนเต็มที่ลงนามมาตรฐาน 5 ประเภท ได้แก่ "signed char", "short int", "int", "long int" และ "long long int" </quote>
Martin York

21

คำหลักที่ไม่ได้ลงชื่อเริ่มต้นเป็นประเภทข้อมูลใน C ++ หรือไม่

ใช่อาจใช้การลงนามและไม่ได้ลงนามเป็นตัวระบุประเภทสแตนด์อโลน

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

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

อย่างไรก็ตามการลงนามและไม่ได้ลงนามอาจใช้เป็นตัวระบุชนิดแบบสแตนด์อโลนซึ่งมีความหมายเหมือนกับ int ที่ลงชื่อและ int ที่ไม่ได้ลงชื่อตามลำดับ การประกาศสองรายการต่อไปนี้เทียบเท่า:

unsigned NextYear;
unsigned int NextYear;

3
มันไม่ "ใช่" ใช่หรือไม่? ค่าเริ่มต้นเป็น int ถ้าใช้โดยไม่มีประเภท?
ผ่อนคลายใน

ขอขอบคุณ! ภาษาอังกฤษไม่ใช่ภาษาแรกของฉันและฉันรู้สึกงุนงงกับความหมายของประเภทข้อมูลที่ไม่ได้ลงชื่อ มีลายเซ็นของใคร ไม่เคยเกิดขึ้นกับฉันเลยว่าอาจมาจากเครื่องหมายนาม ... : D
user74200

คำหลักshortและlongยังมีการพิมพ์การปรับเปลี่ยน ถ้าคุณเขียนshort sหมายถึงที่จริงshort int sเหมือนจริงหมายถึงunsigned u unsigned int u(และunsigned shortหมายถึงunsigned short int)
Ben Voigt

8

คุณสามารถอ่านเกี่ยวกับคำหลักที่ไม่มีการลงชื่อใน c ++ อ้างอิง

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

ในระบบ 32 บิตจำนวนเต็มคือ 32 บิตซึ่งหมายความว่าสามารถมีมูลค่า ~ 4 พันล้าน

และเมื่อมีการลงนามนั่นหมายความว่าคุณต้องแยกมันออกจาก -2 พันล้านถึง +2 พันล้าน

เมื่อไม่ได้ลงนาม แต่ค่าจะไม่มีตัวเลขติดลบดังนั้นสำหรับจำนวนเต็มจะหมายถึง 0 ถึง +4 พันล้าน

มี informationa บิตมากขึ้นการแข่งขันนี้เป็นวิกิพีเดีย


2
ฉันชอบร้องเพลงเพราะตัวเองมากที่สุด คาร์บอนอร่อยและคาร์เมล!
Omnifarious

1
แล้วแก้ไขพิมพ์ผิดล่ะ ... นั่นคือปุ่ม "แก้ไข" มีไว้เพื่ออะไร!
Filip Ekberg

3

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

หูดนี้ส่วนใหญ่ถูกกำจัดไปแล้ว แต่คุณกำลังพบร่องรอยสุดท้ายที่นี่ IMHO รหัสควรได้รับการแก้ไขเพื่อบอกว่าunsigned intเพื่อหลีกเลี่ยงความสับสนที่คุณกำลังประสบอยู่

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