C'de neden kısa, int ve uzun icat edildi?


16

Ben Anlamakta zorlandığım, kesin yaratma amacı neydi short, intve longC veri türleri?

Sormamın nedeni, boyutlarının sınırlı olduğu gibi görünmüyor - örneğin bir boyuttan shortdaha küçük olduğu sürece herhangi bir boyutta olabilirler int.

O halde, hangi durumlarda a yerine bir unsigned intya da unsigned longörneğin kullanmalısınız size_tki bunu yaparken ikili uyumluluk umudu yoktur?

(Boyutu bilmiyorsanız, hangisini seçeceğinizi nasıl bileceksiniz?)


2
Çıkış<stdint.h>
BlackJack

1
@BlackJack: Haha evet aslında - ama sanırım sorum şu: neden bütün bu türler bunun yerine doğal olarak tanımlanmadı? "Gez, 20/20" meselesi mi yoksa belirli bir nedeni mi vardı?
user541686

2
C'nin hem taşınabilir hem de altta yatan donanıma yakın olması gerekiyordu. Baytın 8 bit uzun olmadığı platformlar vardı - ama yine de C'yi kullanabilirsiniz.
SK-logic

@ SK-logic: Dedikleri gibi sizeof(short) == 2 * sizeof(char)ya da benzeri olmasalar bile ?
user541686

1
Burada platformlar var sizeof(char) == sizeof(short)ve mantıklı. Ne yazık ki, tümleşik sayı türlerini olası ve mevcut tüm platformlara uyacak şekilde belirtmenin bir yolu yoktur .
SK-logic

Yanıtlar:


12

Kullandığınız mimari tarafından tanımlanır. Bir Zilog z80 çipinde (ortak gömülü çip) bir boyutta olurken, x86 çipsetinde tamamen farklı bir boyut olabilirler. Ancak, boyutların kendileri sabit oranlardır. Esasen kısa ve uzun tipler değil, int tipine uygundur. Kısa ints (normal) int'den daha küçük bir büyüklük sırası ve uzun ints daha büyük bir büyüklük sırası olacaktır. Yani Int'inizin 4 bayta bağlı olduğunu, kısa niteleyicinin 4 bayta sınırladığını, ancak 2 bayt da çok yaygın olduğunu ve uzun niteleyicinin 4 bayta daha az olabilmesine rağmen potansiyel olarak 8 bayta yükselttiğini varsayalım. Bunun kelime uzunluğuna da tabi olduğunu ve 32 bitlik bir sistemde, her int için 4 baytlık maksimum vereceğinizi unutmayın. Böylece, Kısa ≤ Int ≤ Uzun.

Bununla birlikte, tekrar uzatırsanız, int'i bir sonraki hücreye iterek 8 baytlık depolama alanı elde edebilirsiniz. Bu, 64 bit makineler için kelime boyutudur, bu yüzden bu tür şeyler için endişelenmek zorunda kalmazlar ve uzun hücrelerin bir hücreyi uzun ints için kullanırlar, bu da uzun ints gerçekten biterken standart ints'ın üzerinde başka bir düzen olmalarını sağlar.

Hangisini seçeceğimize göre, Java programcılarının endişelenmesi gerekmeyen bir şeye bağlı. "Mimariniz nedir?" Her şey söz konusu makinenin hafızasının kelime boyutuna bağlı olduğundan, hangisini kullanacağınıza karar vermeden önce bunu anlamanız gerekir. Daha sonra mümkün olduğunca fazla bellek tasarrufu yapmak için makul olan en küçük boyutu seçersiniz, çünkü içindeki tüm bitleri kullansanız da kullanmasanız da bu hafıza tahsis edilir. Böylece yapabildiğiniz yerden tasarruf edersiniz ve yapamadığınızda şort alırsınız ve yapamayacağınız zamanlar ve ne olacağınıza göre daha büyük bir şeye ihtiyacınız varsa; tavan kelimesine çarpana kadar gerektiği kadar uzayacaksınız. O zaman çok sayıda rutin sağlamanız veya bunları bir kütüphaneden almanız gerekir.

C iyi "taşınabilir montaj" olabilir ama yine de donanım bilmek zorunda.


11
bu tam olarak doğru değil, şortların ints'ten daha küçük olması gerekmez, ints'ten daha büyük olamazlar
jk.

Bunu düzeltirim.
Dünya Mühendisi

2
Benzer şekilde, uzun ürünler intlerden daha küçük olamaz.
Donal Fellows

1
Gerçekten de kısa, int ve uzun aynı makinelerin olduğuna inanıyorum.
jk.

6

Bugün bir "bayt", "8 bit" anlamına gelse de, bu her zaman doğru değildir. Makineler 4 bit, 8 bit, 12 bit, 16 bit, 32 bit ve 36 bit (ve muhtemelen bazı diğer boyutlarda) adreslenebilir parçalar kullanmıştır. C'nin tasarım amaçlarından biri, farklı bellek boyutları ve yapılandırmaları olan makinelerde kullanılabilir olmaktı.

Tasarım amacının aslında her boyutun int, çeşitli boyutlardaki sayıları işleyebilecek en küçük şey olması ve int+/- 32767'yi işleyebilecek en pratik "genel amaçlı" boyut olması olduğunu düşünüyorum. Bilgisayarlar o kadar güçlü hale geldiğinde, 64 bitlik sayılardaki işlemlerin daha küçük olanlarla aynı maliyete sahip olacağı bir dil yaratma arzusu veya niyeti olduğunu düşünmüyorum.

C'nin tamsayı tipi anlambilimi ile ilgili en büyük sorun, bazı bağlamlarda kardinal sayıları veya matematiksel tam sayıları temsil ederken, diğer bağlamlarda, uyumlu mod 2 ^ n tamsayı bir cebirsel tamsayı halkasının üyelerini temsil etmek için kullanılmasıdır. 0'dan temsili maksimum değer 1'i vermek üzere tanımlanır], ancak davranışlar, bilgisayar kelime boyutlarının 16 bit civarında olduğu ve 36 bitlik bir kelime büyüklüğünün büyük olacağı günlerde derleyicilerin ne yaptığını temel alarak belirtilir. ), 64 bitlik bir makinede neyin anlamlı olacağını temel almak yerine. Sonuç olarak, 32 bit işaretsiz bir değerin daha küçük işaretsiz 32 bit değerinden çıkarılmasının sonucu, ya 32 bit işaretsiz büyük bir değer ya da negatif 64 bit sayı olabilir.


4

/programming/589575/size-of-int-long-etc

Bu yüzden en yaygın kullanılan mimarilerde, karakter 1 bayt, kısa ve int en az 2 bayt ve uzun en az 4 bayttır.

Ve 'int' in mevcut CPU için en doğal / normal / verimli temsil olması amaçlanmıştır.

Bu nedenle, genel kural değerleriniz +/- 32K'yı aşmadıkça 'int' kullanmaktır ve sizi (eski CPU'larda) 'uzun' kullanır. ... veya küçük (<32K) değerlerden oluşan büyük diziler oluşturmuyorsanız ve bellek bir sorun değilse, bu nedenle belleği kaydetmek için 'kısa' kullanırsınız (veya belki 'char' veya 'byte').


2
Ancak 64 bit intile neredeyse hiç iyi bir seçim değil mi? Neredeyse her zaman , taşıma koduyla ilgili sorunları önlemek için zaten size_t(veya hatta ptrdiff_t!)
user541686

@Merhdad - int, HW'nin 'standart birimi' ve tipik olarak bir işaretçinin boyutu olarak tanımlandığı en iyi seçime alışıktı. Günümüzde güvenlik için size_t kullanıyoruz.
Martin Beckett

1

C, aktif olarak farklı seviyelerde hafıza ile başa çıkmak için tasarlanmıştır. Bellek kısıtlamaları, mimari vb. Nedeniyle kısa, int ve uzun ve kayan ve çift arasındaki farkın önemli olduğu durumlar vardır. Şimdi daha az önemli olmasına rağmen, hala yaptığı ortamlar vardır (örneğin, gömülü ve verilerin büyük olduğu durumlar) ve esas olarak 32 bit mimarilerden 64 bit'e geçiş, bir şekilde tekrar bir sorun haline getirir. (128 bit mimarilere geçiş yaptığımızda ve C / C ++ hala popüler olduğunda, on veya yirmi yılda yine bir sorun olacak). İkili uyumluluğun acı çekmesine rağmen haklısınız, bu yüzden önemli olan bu değişken türü boyutlarını kullanmak istemezsiniz.

Boyutu bilmiyorsanız hangisini nasıl kullanacağınızı sordunuz, ancak belirli bir mimari / derleyici kombinasyonundaki boyutu biliyorsanız ve belleği bu düzeyde optimize etmeniz gerekiyorsa, bunu daha iyi bilirsiniz. Sadece platformlarda bunu optimize edemezsiniz, çünkü boyutlarını bilemezsiniz, bu nedenle bu özellikleri bu amaçla kullanmak istemezsiniz. Ancak C'de yazılan birçok şey platforma özgüdür ve "çapraz platform" modasına rağmen bazı avantajlı optimizasyonlara izin verir.

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.