Size_t ve unsigned int arasındaki fark nedir?


107

Kafam çok karıştı size_t. İnternette aradım ve size_tişaretsiz bir tür olduğundan bahsettiğim her yerde , yalnızca negatif olmayan değerleri temsil edebilir.

İlk sorum şu: eğer sadece negatif olmayan değerleri temsil etmek için kullanılıyorsa, unsigned intbunun yerine neden kullanmıyoruz size_t?

İkinci sorum şu: size_tve unsigned intdeğiştirilebilir mi değil mi? Değilse, neden?

Ve birisi bana size_tbunun işleyişine dair iyi bir örnek ve kısaca verebilir mi?


5
typedef /*This part is implementation dependent */ size_t;
P0W

Yanıtlar:


88

negatif olmayan değeri temsil etmek için kullanılıyorsa, neden unsigned intyerine kullanmıyoruz?size_t

Çünkü unsigned inttek işaretsiz tam sayı türü değil. size_therhangi biri olabilir unsigned char, unsigned short, unsigned int, unsigned longveya unsigned long long, uygulamaya bağlı.

İkinci soru şudur size_tve unsigned intbirbirinin yerine geçebilir veya değiştirilebilir ve değilse neden?

Yukarıda açıklanan nedenle birbirlerinin yerine geçemezler ^^.

Ve birisi bana size_t ve onun kısa çalışması hakkında iyi bir örnek verebilir mi?

"Kısa çalışması" derken ne demek istediğini tam olarak anlamıyorum. Diğer işaretsiz türler gibi çalışır (özellikle, yazıldığı tür gibi). size_tBir nesnenin boyutunu tanımlarken kullanmanız tavsiye edilir . Özellikle, sizeofoperatör ve strlen()dönüş gibi çeşitli standart kütüphane fonksiyonları size_t.

Bonus: İştesize_t (ve yakından ilgili ptrdiff_ttür) hakkında iyi bir makale . Neden kullanmanız gerektiğini çok iyi açıklıyor.


1
Tam olarak nasıl olabilir size_tbir olmak unsigned char? Bu, izin verilen standartta mı? Demek istediğim, bu fikirle, herhangi birinin calloc()(ve aileyi) strlen()vb. Kullanması nasıl beklenebilir ? Bu bana saçma geliyor.
Pryftan

Sanırım size_tstandartta "işaretsiz tamsayı türü" olarak tanımlandı, ancak herhangi biriyle aynı olmasını gerektirmiyor unsigned {char, short, int, long, long long}.
Paul Hankin

80

C'de 5 standart işaretsiz tamsayı türü vardır:

  • unsigned char
  • unsigned short
  • unsigned int
  • unsigned long
  • unsigned long long

boyutları ve aralıkları için çeşitli gereksinimlerle (kısaca, her türün aralığı, sonraki türün aralığının bir alt kümesidir, ancak bazıları aynı aralığa sahip olabilir).

size_ttypedefbazı işaretsiz türler için bir (yani bir takma addır) (muhtemelen yukarıdakilerden biridir, ancak muhtemelen genişletilmiş işaretsiz bir tam sayı türüdür , ancak bu pek olası değildir). sizeofOperatörün verdiği türdür .

Bir sistemde unsigned intboyutları temsil etmek mantıklı olabilir ; diğerinde, unsigned longveya kullanmak daha mantıklı olabilir unsigned long long. ( size_tYa olması pek mümkün değildir unsigned charya da unsigned shorten izin verilir, ancak bu).

Amacı size_thakkında endişe zorunda programcı rahatlatmak için hangi boyutlarını göstermek için kullanılan önceden tanımlanmış türleri.

sizeofBir verdiğini varsayan kod unsigned inttaşınabilir olmayacaktır. A verdiğini varsayan kodun size_ttaşınabilir olma olasılığı daha yüksektir.


6
Bence bu kabul edilen cevap olmalı çünkü neden size_t
kuchi'yi

Keith-Thompson nedenle belirli tip (diğer bir deyişle, bu demek @ unsigned int, unsigned longvs.) olduğu size_tmakineye bağlıdır karşılık gelen kod çalıştırılır? yani bir makine mimarisinde karşılık gelir, unsigned intancak başka bir mimaride karşılık gelir unsigned long, vb?
Richie Thomas

1
@RichieThomas: C uygulamasına bağlıdır. Aynı mimarisine iki farklı derleyiciler için farklı türde seçebilirsiniz size_törneğin, özellikle, unsigned longve unsigned long longaynı boyda.
Keith Thompson

@RichieThomas Bu da bunun bir parçası. Yani max of long, long longvb. Sisteme bağlıdır: Bir bakarsanız, limits.hen azından Unices altında, ints için maksimum değerin sistemin kelime boyutuna bağlı olduğunu göreceksiniz.
Pryftan

1
@Pryftan Motorola 68000 serisine, ayrıca eski Intel x86 serisine bir göz atın (8086 ve 8088'e geri dönüyor).
Keith Thompson

10

size_t belirli bir kısıtlaması vardır.

Http://www.cplusplus.com/reference/cstring/size_t/ adresinden alıntı :

Temel işaretsiz tam sayı türlerinden birinin takma adı.

Herhangi bir nesnenin boyutunu bayt cinsinden temsil edebilen bir türdür : size_t, sizeof operatörü tarafından döndürülen türdür ve boyutları ve sayıları temsil etmek için standart kitaplıkta yaygın olarak kullanılır.

Veri modeli tarafından unsigned intboyutu intbelirlendiği için birbirinin yerine kullanılamaz . Örneğin, LLP64 bir 32-bit intkullanır ve ILP64 bir 64-bit kullanır int.


5
Bu alıntı nereden geliyor? (C standardından değil.)
Keith Thompson

2
Soru etiketli c . C ++ standardının C ile bir ilgisi yoktur.
IInk2

7

size_t, veri nesnelerinin boyutlarını depolamak için kullanılır ve belirli C uygulamasının oluşturabileceği herhangi bir veri nesnesinin boyutunu tutabileceği garanti edilir. Bu veri türü daha küçük (bit sayısı olarak), daha büyük veya işaretsiz int ile tamamen aynı olabilir.


4

Diğer cevapların yanı sıra kodu da belgeler ve insanlara bellekteki nesnelerin boyutu hakkında konuştuğunuzu söyler.


İyi bir nokta. An applebir elma , a size_tbir boyuttur ...
dom_beau

2

size_t türü, C / C ++ dilinin temel işaretsiz tamsayı türüdür. Sizeof operatörü tarafından döndürülen sonucun türüdür. Türün boyutu, herhangi bir türdeki teorik olarak olası bir dizinin maksimum boyutunu depolayabilecek şekilde seçilir. 32 bitlik bir sistemde size_t, 64 bitlik bir 64 bit üzerinde 32 bit alacaktır. Başka bir deyişle, size_t türündeki bir değişken, bir işaretçiyi güvenli bir şekilde saklayabilir. İstisna, sınıf işlevlerine işaretçilerdir, ancak bu özel bir durumdur. Size_t bir işaretçi depolayabilse de, bu amaç için başka bir işaretsiz tamsayı türü uintptr_t kullanmak daha iyidir (adı, yeteneğini yansıtır). Size_t ve uintptr_t türleri eşanlamlıdır. size_t türü genellikle döngü sayaçları, dizi indeksleme ve adres aritmetiği için kullanılır. Size_t türünün olası maksimum değeri SIZE_MAX sabittir.


1
size_therhangi bir tek nesnenin boyutunu depolayabilir. Bir işaretçi, herhangi bir nesnenin herhangi bir baytına işaret edebilir. Örneğin, herhangi bir nesnenin boyutunu 2 ** 32-1 bayta sınırlayan 64 bit adres alanına sahip bir sisteminiz olabilir. Garantisi yoktur size_tve uintptr_taynı türüdür.
Keith Thompson

2

Basit bir deyişle, size_t platformdur ve aynı zamanda uygulamaya bağlıdır, işaretsiz int ise yalnızca platforma bağlıdır.

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.