İnt32, int, int32_t, int8 ve int8_t arasındaki fark


107

int32_tGeçenlerde bir C programında veri tipine rastladım . 32 bit depoladığını biliyorum, ama saklamıyor intve int32aynısını mı yapıyor?

Ayrıca charbir programda kullanmak istiyorum . Onun int8_tyerine kullanabilir miyim ? Fark ne?

Özetlemek gerekirse: C'de int32, int, int32_t, int8 ve int8_t arasındaki fark nedir?

Yanıtlar:


125

Arasında int32ve int32_t, (ve aynı şekilde arasına int8ve int8_tC standart tanımlar:) farka oldukça basittir int8_tve int32_tancak şey adlandırılmış tanımlamıyor int8veya int32- (hepsi de varsa) ikincisi diğer bazı üst bilgi veya kütüphaneden muhtemelen (büyük olasılıkla ilave öncedir int8_tve int32_t) C99.

Sade int, diğerlerinden biraz farklı. Nerede int8_tve int32_ther birinin belirli bir boyutu vardır, intherhangi bir boyut> = 16 bit olabilir. Farklı zamanlarda, hem 16 bit hem de 32 bit oldukça yaygındır (ve 64 bitlik bir uygulama için muhtemelen 64 bit olmalıdır).

Öte yandan, intC'nin her uygulamasında nerede int8_tve int32_tne olursa olsun bulunması garanti edilir . Muhtemelen bunun sizin için önemli olup olmadığını sorgulamaya açıktır. Küçük gömülü sistemlerde ve / veya daha eski derleyicilerde C kullanıyorsanız, bu bir sorun olabilir. Öncelikle masaüstü / sunucu makinelerde modern bir derleyici ile kullanırsanız, muhtemelen olmayacaktır.

Hata! İle ilgili kısmı kaçırdık char. int8_tTamsayı türünün tam olarak 8 bit olması garanti edilen bir tamsayı türünün olmasını istiyorsanız (ve yalnızca), char yerine kullanırsınız . Karakterleri saklamak istiyorsanız, muhtemelen charbunun yerine kullanmak istersiniz . Boyutu değişebilir (bit sayısı bakımından) ancak tam olarak bir bayt olması garanti edilir. Yine de ufak bir tuhaflık: bir düzlüğün charimzalı mı yoksa imzasız mı olduğu konusunda bir garanti yoktur (ve birçok derleyici, derleme zamanı bayrağına bağlı olarak onu ikisinden birini yapabilir). İmzalı veya imzasız olduğundan emin olmanız gerekiyorsa, bunu açıkça belirtmeniz gerekir.


1
@linuxfreak: Emin değilim bool_t- daha önce hiç duymadım. C standardı _Boolyerleşik bir tür olarak tanımlanır. boolyalnızca siz #include <stdbool.h>(genişleyen bir makro olarak _Bool) tanımlanır.
Jerry Coffin

5
"64 bitlik bir uygulama için (int) muhtemelen 64 bit olmalıdır" dediniz. Pratikte int, Windows, Mac OS X, Linux ve çeşitli UNIX türleri dahil olmak üzere tüm yaygın 64 bit platformlarda 32 bittir. Bir istisna, Cray / UNICOS'tur, ancak bu günlerde modası geçmiştir.
Sam Watkins

6
@SamWatkins: Evet, bu yüzden dikkatlice "olmalı", "değil" dedim. Standart, bunun "mimarinin önerdiği doğal boyut" olduğunu söylüyor, bu da (IMO) 64 bitlik bir işlemcide gerçekten 64 bit olması gerektiği anlamına geliyor t). Daha pratik bir bakış açısıyla, bir C89 içinde türleri arasında 32 bit türü olması müthiş kullanışlı ve int 64 bit ise, çok uzun, bu yüzden sık sık hayır 32 bit olurdu en azından 64 bit olmak zorunda yazın.
Jerry Coffin

2
@barlop: Evet. (Hem C hem de C ++, char için minimum 255 değer aralığını zorunlu kılar, bu nedenle en az 8 bit gerektirir, ancak daha fazla olabilir).
Jerry Coffin

2
Her zaman bir baytın tam olarak 8 bit olduğu izlenimine
kapılmıştım

18

_T veri türleri stdint.h üstbilgisindeki typedef türleriyken, int yerleşik bir temel veri türüdür. Bu, _t'yi yalnızca stdint.h varsa kullanılabilir hale getirir. int ise var olduğu garantilidir.


2
_T olanlar neden kullanılır?
Deven

@Deven Kodunuzun bir yerde çalışıp başka bir yerde çalışmadığı durumdan kaçınmak için.
Franklin Yu

3

Açıkça belirtilmediyse, "boyut" un değişken olduğunu her zaman aklınızda bulundurun.

 int i = 10;

Bazı sistemlerde derleyici tarafından 16 bitlik tamsayı, bazılarında ise 32 bitlik tamsayı (veya daha yeni sistemlerde 64 bitlik tamsayı) ile sonuçlanabilir.

Gömülü ortamlarda bu garip sonuçlarla sonuçlanabilir (özellikle bellek eşlemeli G / Ç ile çalışırken veya basit bir dizi durumu olarak kabul edilebilir), bu nedenle sabit boyutlu değişkenlerin belirtilmesi şiddetle tavsiye edilir. Eski sistemlerde karşılaşabilirsiniz

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

Tasarımcılar, C99'dan başlayarak, esasen benzer tip metinleri kullanan stdint.h başlık dosyasını ekledi.

Windows tabanlı bir sistemde, stdin.h başlık dosyasındaki girişleri şu şekilde görebilirsiniz:

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

Minimum genişlikli tam sayı veya tam genişlikli tam sayı türleri gibi bundan çok daha fazlası var, daha iyi bir anlayış için stdint.h'yi araştırmanın kötü bir şey olmadığını düşünüyorum.


1
Kodunuzda bir yazım hatası var: typedef short INT16;yok typedefs short INT16.
Galaxy
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.