ความแตกต่างระหว่าง int32, int, int32_t, int8 และ int8_t


107

ฉันเจอประเภทข้อมูลint32_tในโปรแกรม C เมื่อเร็ว ๆ นี้ ฉันรู้ว่าจะเก็บ 32 บิต แต่ทำไม่ได้intและint32ทำเช่นเดียวกันหรือไม่

นอกจากนี้ฉันต้องการใช้charในโปรแกรม ใช้int8_tแทนได้ไหม? อะไรคือความแตกต่าง?

สรุป: int32, int, int32_t, int8 และ int8_t ใน C ต่างกันอย่างไร

คำตอบ:


125

ระหว่างint32และint32_t(และในทำนองเดียวกันระหว่างint8และint8_t) ความแตกต่างนั้นค่อนข้างง่าย: มาตรฐาน C กำหนดint8_tและint32_tแต่ไม่ได้กำหนดชื่ออะไรint8หรือint32- หลัง (ถ้ามีอยู่เลย) อาจมาจากส่วนหัวหรือไลบรารีอื่น ๆ (เป็นไปได้มากที่สุด เกิดก่อนการเพิ่มint8_tและint32_tใน C99)

ธรรมดาintค่อนข้างแตกต่างจากที่อื่นเล็กน้อย ที่ไหนint8_tและint32_tมีขนาดที่ระบุintสามารถมีขนาดใดก็ได้> = 16 บิต ในช่วงเวลาที่ต่างกันทั้ง 16 บิตและ 32 บิตเป็นเรื่องธรรมดาพอสมควร (และสำหรับการใช้งาน 64 บิตก็น่าจะเป็น 64 บิต)

บนมืออื่น ๆ ที่intมีการประกันเพื่อนำเสนอในการดำเนินงานของ C ที่ทุกint8_tและint32_tไม่ได้ อาจเปิดให้มีคำถามว่าเรื่องนี้มีความสำคัญกับคุณหรือไม่ หากคุณใช้ C บนระบบฝังตัวขนาดเล็กและ / หรือคอมไพเลอร์รุ่นเก่าอาจเป็นปัญหาได้ หากคุณใช้งานร่วมกับคอมไพเลอร์สมัยใหม่บนเครื่องเดสก์ท็อป / เซิร์ฟเวอร์เป็นหลักอาจจะไม่เป็นเช่นนั้น

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


1
@linuxfreak: ไม่แน่ใจbool_t- ไม่เคยได้ยินมาก่อน มาตรฐาน C กำหนด_Boolให้เป็นประเภทในตัว boolถูกกำหนดเฉพาะในกรณีที่คุณ#include <stdbool.h>(เป็นมาโครที่ขยายเป็น_Bool)
Jerry Coffin

5
คุณบอกว่า "สำหรับการใช้งาน 64 บิต (int) ควรเป็น 64 บิต" ในทางปฏิบัติ int คือ 32 บิตบนแพลตฟอร์ม 64 บิตทั่วไปทั้งหมดรวมถึง Windows, MacOS X, Linux และ UNIX หลากรสชาติ ข้อยกเว้นประการหนึ่งคือ Cray / UNICOS แต่ทุกวันนี้พวกเขาไม่ทันสมัย
Sam Watkins

6
@ SamWatkins: ใช่นั่นคือเหตุผลที่ฉันพูดอย่างระมัดระวังว่า "ควรจะ" ไม่ใช่ "เป็น" มาตรฐานระบุว่าเป็น "ขนาดตามธรรมชาติที่สถาปัตยกรรมแนะนำ" ซึ่ง (IMO) หมายถึงโปรเซสเซอร์ 64 บิตจริงๆแล้วควรเป็น 64 บิต (แม้ว่าจะดีกว่าหรือแย่กว่านั้น t). จากมุมมองในทางปฏิบัติมากขึ้นก็คือชะมัดประโยชน์ที่จะมีชนิด 32 บิตในชนิดใน C89 และถ้า int เป็น 64 บิตยาวจะต้องมีอย่างน้อย 64 บิตเกินไปจึงมีบ่อยครั้งที่ต้องการจะไม่มีแบบ 32 บิต ประเภท.
Jerry Coffin

2
@barlop: ใช่ (ทั้ง C และ C ++ กำหนดช่วงต่ำสุด 255 ค่าสำหรับถ่านดังนั้นจึงต้องมีอย่างน้อย 8 บิต แต่สามารถมากกว่านั้นได้)
Jerry Coffin

2
ฉันมักจะรู้สึกว่าหนึ่งไบต์เท่ากับ 8 บิตไม่ใช่ที่ใดก็ได้ตั้งแต่ 8 บิตขึ้นไป
ErlVolton

18

ชนิดข้อมูล _t เป็นประเภท typedef ในส่วนหัว stdint.h ในขณะที่ int เป็นชนิดข้อมูลพื้นฐานที่สร้างขึ้น สิ่งนี้ทำให้ _t พร้อมใช้งานเฉพาะเมื่อมี stdint.h int ในทางกลับกันรับประกันว่าจะมีอยู่จริง


2
ทำไมคนถึงใช้ _t?
Deven

@Deven เพื่อหลีกเลี่ยงกรณีที่รหัสของคุณทำงานที่อื่น แต่ไม่ใช่ที่อื่น
Franklin Yu

3

โปรดทราบเสมอว่า 'ขนาด' เป็นตัวแปรหากไม่ได้ระบุไว้อย่างชัดเจนดังนั้นหากคุณประกาศ

 int i = 10;

ในบางระบบอาจทำให้เกิดจำนวนเต็ม 16 บิตโดยคอมไพเลอร์และในบางระบบอาจส่งผลให้เป็นจำนวนเต็ม 32 บิต (หรือจำนวนเต็ม 64 บิตในระบบที่ใหม่กว่า)

ในสภาพแวดล้อมแบบฝังสิ่งนี้อาจได้ผลลัพธ์แปลก ๆ (โดยเฉพาะในขณะที่จัดการกับหน่วยความจำที่แมป I / O หรืออาจพิจารณาสถานการณ์อาร์เรย์แบบธรรมดา) ดังนั้นจึงขอแนะนำอย่างยิ่งให้ระบุตัวแปรขนาดคงที่ ในระบบเดิมคุณอาจเจอ

 typedef short INT16;
 typedef int INT32;
 typedef long INT64; 

เริ่มจาก C99 นักออกแบบได้เพิ่มไฟล์ส่วนหัว stdint.h ซึ่งใช้ประโยชน์จาก typedef ที่คล้ายกัน

ในระบบที่ใช้ windows คุณอาจเห็นรายการในไฟล์ส่วนหัว stdin.h เป็นไฟล์

 typedef signed char       int8_t;
 typedef signed short      int16_t;
 typedef signed int        int32_t;
 typedef unsigned char     uint8_t;

มีมากกว่านั้นเช่นจำนวนเต็มความกว้างต่ำสุดหรือประเภทจำนวนเต็มความกว้างที่แน่นอนฉันคิดว่าการสำรวจ stdint.h ไม่ใช่เรื่องเลวร้ายเพื่อความเข้าใจที่ดีขึ้น


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