ประเภทเช่น uint32, int32, uint64, int64 ถูกกำหนดไว้ในส่วนหัวของ stdlib หรือไม่


95

ฉันมักจะเห็นซอร์สโค้ดโดยใช้ประเภทเช่น uint32, uint64 และฉันสงสัยว่าควรกำหนดโดยโปรแกรมเมอร์ในรหัสแอปพลิเคชันหรือหากกำหนดไว้ในส่วนหัว lib มาตรฐาน

อะไรคือวิธีที่ดีที่สุดในการมีประเภทเหล่านี้ในซอร์สโค้ดแอปพลิเคชันของฉัน

คำตอบ:


137

C99 stdint.hกำหนดสิ่งเหล่านี้:

  • int8_t
  • int16_t
  • int32_t
  • uint8_t
  • uint16_t
  • uint32_t

และหากสถาปัตยกรรมรองรับ:

  • int64_t
  • uint64_t

มีตัวพิมพ์จำนวนเต็มอื่น ๆ ด้วยstdint.hเช่นกัน

หากคุณติดอยู่โดยไม่มีสภาพแวดล้อม C99 คุณควรจัดหา typedef ของคุณเองและใช้ C99 ต่อไป

uint32และuint64(เช่นโดยไม่ต้อง_tต่อท้าย) อาจจะเป็นเฉพาะของโปรแกรม


16
คำตอบนี้ผิด ทั้งหมดที่กล่าวมาจะใช้ได้เฉพาะเมื่อมีประเภทความกว้างที่แน่นอนของขนาดนั้น (ไม่มีช่องว่างภายใน) ในการใช้งาน แม้ว่าจะไม่ได้ แต่ประเภทint_leastNN_tและuint_leastNN_tสำหรับNN8, 16, 32, และ 64 ต้องอยู่เสมอ C99 ไม่อนุญาตให้ใช้งานที่ไม่มีประเภทจำนวนเต็มอย่างน้อย 64 บิตเนื่องจากlong longจำเป็นต้องมีขนาดใหญ่เป็นอย่างน้อย
R .. GitHub STOP HELPING ICE

@R .. : จะถูกต้องหรือไม่หากพูดว่า "POSIX stdint.h" แทนที่จะเป็น "C99 stdint.h"
สั้นเกินไป

1
POSIX stdint.hต้องการพวกเขาทั้งหมด
R .. GitHub STOP HELPING ICE

1
@ ร .. ขอแก้ไขคำตอบนี้เพื่อความถูกต้องได้ไหม ฉันใช้เวลาเล็กน้อยในการแยกวิเคราะห์การรวมกันของเนื้อหาปัจจุบันและความคิดเห็นของคุณ
merlin2011

SDL กำหนดนามแฝงtypedef uint32_t Uint32;ในนามแฝงใน include / SDL_stdinc.h (ถ้าคุณเป็นผู้ใช้ SDL)
Et7f3XIV

10

ประเภทจำนวนเต็มเหล่านี้ถูกกำหนดไว้ทั้งหมดใน stdint.h


ไม่ใช่stdint.hเฉพาะการนำไปใช้งานใช่หรือไม่ ดูคำถามนี้และคำถามนี้ด้วย
Chris Frederick

3
เมื่อมองไปที่ไฟล์ฉันพบ "ISO C99: 7.18 Integer types <stdint.h>" ในความคิดเห็น ฉันคิดว่าคุณจะได้รับstdint.hถ้าคุณเคารพมาตรฐาน C99
philix

ฉันไม่ได้หาใด ๆ stdint.hของพวกเขาใน นี้จะส่งกลับ 0 grep uint32 /usr/lib/gcc/x86_64-linux-gnu/4.9/include/stdint.h | grep -v uint32_tยอดนิยม:
jww

1
@jww: ในกรณีของฉันไฟล์นั้นมี#include "stdint-gcc.h"และการ grepping ไฟล์นั้นให้คำจำกัดความ
Victor Zamanian

1
@jww ใช่พวกเขาไม่อยู่ สิ่งเดียวที่เป็นมาตรฐานและควรกำหนดมีเพียง_tคำต่อท้ายตามที่ระบุไว้ในคำตอบด้านบน
Victor Zamanian

2

หากคุณใช้ C99 เพียงแค่ใส่stdint.h. BTW ประเภท 64 บิตอยู่ที่นั่นหากโปรเซสเซอร์รองรับ


โปรดอ้างอิงบางสิ่งในเรื่องนี้
BiGYaN

6
x86 ไม่รองรับคณิตศาสตร์ 64 บิต แต่มีประเภท 64 บิต
R .. GitHub STOP HELPING ICE

2
ใช่. รองรับการคูณ 32-bit x 32-bit -> 64-bit, 64-bit / 32-bit -> ผลหาร 32-bit และการหารส่วนที่เหลือ 32-bit รวมถึงการเพิ่มด้วย carry และลบด้วยคำแนะนำในการยืม มันถูกสร้างขึ้นเพื่อให้สามารถคำนวณเลขคณิต 64 บิตถ้าเพียงเพราะ 8086 จำเป็นต้องสามารถทำเลขคณิต 32 บิตได้
Michael Morris

นอกจากนี้ยังมีuint128_tif __SIZEOF_INT128__กำหนดเป็น 16 หรือสูงกว่า (GCC และเข้ากันได้) มีอยู่ในเครื่อง x86_64 / amd64 แต่โปรเซสเซอร์ไม่รองรับโดยกำเนิด เฉพาะ Cray's เท่านั้นที่มีขนาดการลงทะเบียน IIRC
jww

0

ผู้ถามถามจริงเกี่ยวกับ int16 (ฯลฯ ) มากกว่า (น่าเกลียด) int16_t (ฯลฯ )

ไม่มีส่วนหัวมาตรฐาน - หรือในโฟลเดอร์ / usr / include / ของ Linux ที่กำหนดโดยไม่มี "_t"

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