ในโลก Unix มีข้อตกลงที่เป็นไปได้สองสามประการสำหรับขนาดของจำนวนเต็มและตัวชี้สำหรับแพลตฟอร์ม 64 บิต ทั้งสองส่วนใหญ่ใช้กันอย่างแพร่หลายคือ ILP64 (อันที่จริงมีเพียงไม่กี่ตัวอย่างเท่านั้น; Cray เป็นหนึ่งในนั้น) และ LP64 (สำหรับเกือบทุกอย่าง) ตัวย่อมาจาก 'int, long, pointers คือ 64-bit' และ 'long, pointers เป็น 64-bit'
Type ILP64 LP64 LLP64
char 8 8 8
short 16 16 16
int 64 32 32
long 64 64 32
long long 64 64 64
pointer 64 64 64
ระบบ ILP64 ถูกทอดทิ้งในความโปรดปรานของLP64 (นั่นคือเกือบทั้งหมดต่อมาใช้ LP64 ตามคำแนะนำของกลุ่มแอสเพนระบบเดียวที่มีมรดกยาวนานของการทำงาน 64 บิตใช้รูปแบบที่แตกต่างกัน) ระบบ Unix 64 บิตที่ทันสมัยทั้งหมดใช้ LP64 MacOS X และ Linux เป็นระบบ 64 บิตที่ทันสมัย
Microsoft ใช้รูปแบบที่แตกต่างกันสำหรับการเปลี่ยนเป็น 64 บิต: LLP64 ('ตัวชี้ความยาวยาวคือ 64 บิต') นี่เป็นข้อดีของความหมายที่ว่าซอฟต์แวร์ 32- บิตสามารถทำการคอมไพล์ใหม่ได้โดยไม่มีการเปลี่ยนแปลง มันมีข้อผิดพลาดที่แตกต่างจากสิ่งที่คนอื่นทำและต้องมีการแก้ไขโค้ดเพื่อใช้ประโยชน์จากความจุ 64- บิต จำเป็นต้องมีการแก้ไขเสมอ; มันเป็นชุดการแก้ไขที่แตกต่างจากชุดที่ต้องการบนแพลตฟอร์ม Unix
หากคุณออกแบบซอฟต์แวร์ของคุณรอบ ๆ ชื่อประเภทจำนวนเต็มเป็นกลางแพลตฟอร์มอาจใช้<inttypes.h>
ส่วนหัวC99 ซึ่งเมื่อประเภทที่มีอยู่บนแพลตฟอร์มให้ในลงชื่อ (จดทะเบียน) และไม่ได้ลงนาม (ไม่อยู่ในรายการ; คำนำหน้าด้วย 'u'):
int8_t
- จำนวนเต็ม 8 บิต
int16_t
- จำนวนเต็ม 16 บิต
int32_t
- จำนวนเต็ม 32 บิต
int64_t
- จำนวนเต็ม 64 บิต
uintptr_t
- จำนวนเต็มที่ไม่ได้ลงชื่อมีขนาดใหญ่พอที่จะเก็บพอยน์เตอร์
intmax_t
- ขนาดใหญ่ที่สุดบนแพลตฟอร์ม (อาจใหญ่กว่าint64_t
)
จากนั้นคุณสามารถโค้ดแอปพลิเคชันของคุณโดยใช้ประเภทเหล่านี้ในที่ที่มันสำคัญและระมัดระวังอย่างมากกับประเภทของระบบ (ซึ่งอาจแตกต่างกัน) มีintptr_t
ประเภทคือ- ประเภทจำนวนเต็มลงนามสำหรับการถือพอยน์เตอร์; คุณควรวางแผนที่จะไม่ใช้มันหรือใช้มันเป็นผลมาจากการลบสองuintptr_t
ค่า ( ptrdiff_t
)
แต่ตามที่คำถามชี้ให้เห็น (ในการปฏิเสธศรัทธา) มีระบบที่แตกต่างกันสำหรับขนาดของชนิดข้อมูลจำนวนเต็มบนเครื่อง 64 บิต รับใช้มัน โลกจะไม่เปลี่ยนแปลง