Uint32, int32, uint64, int64 gibi türler herhangi bir stdlib başlığında tanımlanmış mı?


95

Genellikle uint32, uint64 gibi türler kullanan kaynak kodu görüyorum ve bunların programcı tarafından uygulama kodunda mı yoksa standart bir lib başlığında mı tanımlanmış olmaları gerektiğini merak ediyorum.

Bu türlerin uygulama kaynak kodumda bulunmasının en iyi yolu nedir?

Yanıtlar:


137

C99 stdint.hşunları tanımlar:

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

Ve mimari onları destekliyorsa:

  • int64_t
  • uint64_t

Diğer çeşitli tamsayı türleri stdint.hde vardır.

Bir C99 ortamı olmadan sıkışıp kalırsanız, muhtemelen kendi yazı tiplerinizi tedarik etmeli ve yine de C99 olanları kullanmalısınız.

uint32Ve uint64(yani olmadan _tsoneki) muhtemelen uygulama özeldir.


16
Bu cevap yanlış. Yukarıdakilerin tümü, yalnızca bu boyutta tam bir genişlik türü (dolgu yok) uygulamada mevcutsa kullanılabilir. Hatta değilse, ancak, tipleri int_leastNN_tve uint_leastNN_tiçin NN8, 16, 32, ve 64 daima mevcut olmalıdır . C99, en az 64 bitlik bir tamsayı türü olmayan uygulamalara izin vermez, çünkü long longen azından bu kadar büyük olması gerekir.
R .. GitHub BUZA YARDIM ETMEYİ DURDUR

@R ..: "C99 stdint.h" yerine "POSIX stdint.h" demek doğru olur mu?
mu çok kısa

1
POSIX stdint.hhepsini gerektirir.
R .. GitHub BUZA YARDIM ETMEYİ DURDUR

1
@R .., Lütfen bu yanıtı doğruluk için düzenler misiniz? Mevcut içerik ve yorumlarınızın kombinasyonunu ayrıştırmam biraz zaman aldı.
merlin2011

SDL typedef uint32_t Uint32;, include / SDL_stdinc.h'de (SDL kullanıcısıysanız)
Et7f3XIV

10

Bu tam sayı türlerinin tümü, stdint.h


stdint.hUygulamaya özgü değil mi? Ayrıca bu soruyu ve şu soruyu da görün
Chris Frederick

3
Dosyaya baktığımda yorumlarda "ISO C99: 7.18 Tamsayı türleri <stdint.h>" buldum. Sanırım stdint.hC99 standardına saygı duyuyorsanız anlarsınız.
philix

Hiçbirini içinde bulamıyorum stdint.h. Bu 0 hit döndürür: grep uint32 /usr/lib/gcc/x86_64-linux-gnu/4.9/include/stdint.h | grep -v uint32_t.
jww

1
@jww: Benim durumumda, bu dosya içerir #include "stdint-gcc.h"ve bu dosyanın grep edilmesi tanımları verir.
Victor Zamanian

1
@jww evet, yoklar. Standart olan ve tanımlanması gerekenler _t, yukarıdaki cevapta listelendiği gibi son eke sahip olanlardır .
Victor Zamanian

2

C99 kullanıyorsanız, sadece ekleyin stdint.h. BTW, 64bit türleri, işlemci onları destekliyorsa orada.


Lütfen bu konuda bir alıntı yapınız.
BiGYaN

6
x86, 64-bit matematiği desteklemez ancak 64-bit türleri vardır.
R .. GitHub BUZA YARDIM ETMEYİ DURDUR

2
Evet öyle. 32-bit x 32-bit -> 64-bit çarpma, 64-bit / 32-bit -> 32-bit bölüm ve 32-bit kalan bölmeyi destekler ve ayrıca, ödünç alma talimatları ile taşıma ve çıkarma ile toplama özelliklerine sahiptir. Sadece 8086'nın 32-bit aritmetik yapabilmesi gerektiği için 64-bit aritmetik yapabilmek için inşa edildi.
Michael Morris

Ayrıca 16 veya daha büyük (GCC ve uyumlular) olarak tanımlanmış bir uint128_tif vardır __SIZEOF_INT128__. X86_64 / amd64 makinelerinde mevcuttur, ancak işlemci bunu yerel olarak desteklemez. Sadece Cray'ler bu kayıt boyutuna sahiptir, IIRC.
jww

0

Soru soran kişi aslında (çirkin) int16_t (vb.) Yerine int16 (vb.) Hakkında soru sordu.

Standart başlıklar veya Linux'un / usr / include / klasöründe bunları "_t" olmadan tanımlayan hiçbir başlık yoktur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.