Apakah tipe seperti uint32, int32, uint64, int64 ditentukan dalam header stdlib?

94

Saya sering melihat kode sumber menggunakan jenis seperti uint32, uint64 dan saya bertanya-tanya apakah mereka harus didefinisikan oleh programmer dalam kode aplikasi atau jika mereka didefinisikan dalam header lib standar.

Apa cara terbaik untuk memiliki jenis ini di kode sumber aplikasi saya?

philix
sumber

Jawaban:

135

C99 stdint.hmendefinisikan ini:

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

Dan, jika arsitektur mendukungnya:

  • int64_t
  • uint64_t

Ada berbagai typedef integer lainnya stdint.hjuga.

Jika Anda terjebak tanpa lingkungan C99 maka Anda mungkin harus menyediakan typedefs Anda sendiri dan tetap menggunakan C99.

The uint32dan uint64(yaitu tanpa _takhiran) mungkin aplikasi spesifik.

mu terlalu pendek
sumber
16
Jawaban ini salah. Semua hal di atas hanya tersedia jika jenis lebar persis dari ukuran tersebut (tanpa padding) ada dalam implementasinya. Meskipun tidak, bagaimanapun, tipe int_leastNN_tdan uint_leastNN_tuntuk NN8, 16, 32, dan 64 harus selalu ada . C99 tidak mengizinkan implementasi tanpa tipe integer minimal 64 bit, karena long longharus paling tidak sebesar itu.
R .. GitHub STOP HELPING ICE
@R ..: Apakah lebih akurat untuk mengatakan "POSIX stdint.h" daripada "C99 stdint.h"?
mu terlalu pendek
1
POSIX stdint.hmembutuhkan semuanya.
R .. GitHub STOP HELPING ICE
1
@R .., Bisakah Anda mengedit jawaban ini untuk mengetahui kebenarannya? Saya butuh sedikit untuk mengurai kombinasi konten saat ini dan komentar Anda.
merlin2011
SDL mendefinisikan alias alias tersebut typedef uint32_t Uint32;di include / SDL_stdinc.h (jika Anda adalah pengguna SDL)
Et7f3XIV
10

Jenis bilangan bulat tersebut semuanya didefinisikan dalam stdint.h

GWW
sumber
Bukankah stdint.hpenerapannya khusus? Juga lihat pertanyaan ini dan pertanyaan ini
Chris Frederick
3
Melihat file tersebut saya menemukan "ISO C99: 7.18 Integer types <stdint.h>" di komentar. Saya kira Anda mengerti stdint.hjika Anda menghormati standar C99.
philix
Saya tidak menemukan satu pun dari mereka di stdint.h. Ini mengembalikan 0 hits: grep uint32 /usr/lib/gcc/x86_64-linux-gnu/4.9/include/stdint.h | grep -v uint32_t.
jww
1
@jww: Dalam kasus saya, file yang berisi #include "stdint-gcc.h", dan grepping bahwa berkas menghasilkan definisi.
Victor Zamanian
1
@jww ya, mereka tidak ada. Yang standar dan harus didefinisikan hanya yang memiliki _tsufiks, seperti yang tercantum pada jawaban di atas.
Victor Zamanian
2

Jika Anda menggunakan C99, sertakan saja stdint.h. BTW, tipe 64bit ada jika prosesor mendukungnya.

BiGYaN
sumber
Harap kutip sesuatu dalam hal ini.
BiGYaN
6
x86 tidak mendukung matematika 64-bit tetapi memiliki tipe 64-bit.
R .. GitHub STOP HELPING ICE
2
Ya, itu benar. Ini mendukung 32-bit x 32-bit -> 64-bit perkalian, 64-bit / 32-bit -> 32-bit hasil bagi & 32-bit pembagian sisa, serta menambahkan dengan membawa dan mengurangi dengan instruksi pinjaman. Itu dibangun untuk dapat melakukan aritmatika 64-bit, jika hanya karena 8086 diperlukan untuk dapat melakukan aritmatika 32-bit.
Michael Morris
Ada juga uint128_tjika __SIZEOF_INT128__ditetapkan ke 16 atau lebih besar (GCC dan kompatibel). Ini tersedia di mesin x86_64 / amd64, tetapi prosesor tidak mendukungnya. Hanya Cray yang memiliki ukuran register itu, IIRC.
jww
0

Penanya sebenarnya bertanya tentang int16 (dll) daripada (jelek) int16_t (dll).

Tidak ada header standar - juga tidak ada di / usr / include / folder Linux yang mendefinisikannya tanpa "_t".

Steve
sumber