imzasız veri türü nedir?


93

Bu unsigned"tipsiz" türün birkaç kez kullanıldığını gördüm, ancak bunun için bir açıklama görmedim. Sanırım karşılık gelen bir signedtürü var. İşte bir örnek:

Şimdiye kadar topladıklarım:
- sistemimde, sizeof(unsigned) = 4(32 bitlik işaretsiz int ima eder)
- başka bir türü işaretsiz sürüme dönüştürmek için bir kısaltma olarak kullanılabilir:

Bu ANSI C mi yoksa sadece bir derleyici uzantısı mı?

Yanıtlar:


147

unsignedgerçekten için bir kısaltmadır unsigned intve standart C'de tanımlanmıştır.


32

unsignedanlamına gelir unsigned int. signedanlamına gelir signed int. Sadece kullanmak unsigned, bir unsigned intC'yi bildirmenin tembel bir yoludur . Evet, bu ANSI'dir.


15

Tarihsel olarak C'de, bir veri türünü atlarsanız "int" varsayılırdı. Yani "işaretsiz", "işaretsiz int" için bir kısaltmadır. Bu, uzun süredir kötü bir uygulama olarak görülüyordu, ancak hala onu kullanan makul miktarda kod var.


6
Bunun kötü bir uygulama olduğunun farkında değildim. Bunun bir gerekçesi var mı? longyerine long intçok yaygındır, bu yüzden neden unsignedyerine unsigned intkabul edilebilir olmadığından emin değilim .
CB Bailey

10
@Charles Bailey: Bu günlerde - en azından resmi olmaktan ziyade pragmatik iseniz - long, int, short ve char farklı veri türleri olarak kabul ediliyor, çünkü bunlar farklı boyutlarda olabilir ve işaretsiz (ve varsayılan, imzalı) niteleyici. Bu nedenle, "unsigned int" kelimesini "unsigned long" veya "unsigned char" gibi kullanırsınız (ve sadece int'i kaçırmadığınızı açıkça gösterir). "Long int" veya "short int" de int gereksizdir.
Dipstick

1
@Dipstick, "long", "int" için bir niteleyicidir. Görünüşe göre "unsigned int" içindeki int, "unsigned long int" içindeki int kadar gereksiz.
Conrad Meyer

1
Bu, örtük "int" kuralı ile aynı değildir. Bu cevap yanıltıcıdır.

8

C, unsignediçin bir kısayoldur unsigned int.

Aynı longşeye sahipsin, bunun için bir kısayollong int

Ayrıca a unsigned long( a olacaktır unsigned long int) beyan etmek de mümkündür .

Bu ANSI standardındadır


Evet. unsignedaynı unsigned intama WG14 / N1124 Komite Taslağı - 6 Mayıs 2005 ISO / IEC 9899: TC2 için bir arama yaptım unsignedve nerede tanımlandığını bulamadım ... tanımlandığı kısımdan alıntı yapabilir misiniz?
user454322

5

C ve C ++ 'da

N bit içeren işaretsiz bir tamsayı, 0 ile (2 ^ n-1) arasında bir değere sahip olabilir, bu da 2 ^ n farklı değerdir.

İşaretsiz bir tamsayı, pozitif veya sıfırdır.

İmzalı tamsayılar, 2'nin tamamlayıcısı kullanılarak bir bilgisayarda saklanır.


2

C17 6.7.2 §2'ye göre:

Her tür belirleyici listesi, aşağıdaki çoklu kümelerden biri olmalıdır (öğe başına birden fazla çoklu küme olduğunda virgülle sınırlandırılır); tür belirleyicileri, muhtemelen diğer bildirim belirteçleri ile karıştırılmış herhangi bir sırada oluşabilir

- void
- char
- imzalı karakter
- imzasız karakter
- kısa, imzalı kısa, kısa int veya imzalı kısa int
- imzasız kısa veya imzasız kısa int
- int, imzalı veya imzalı int
- imzasız veya imzasız int
- uzun, imzalı uzun , long int veya işaretli long int
- unsigned long veya unsigned long int
- long long, signed long long, long long int, or signed long long int
- unsigned long long, or unsigned long long int
- float
- double
- long double
- _Bool
- float _Complex
- double _Complex
- long double _Complex
- atomik tip belirleyici
- yapı veya birleşim belirticisi
- enum belirticisi
- typedef adı

Yani unsigned intya yazabilirsek unsignedya unsigned intda deli hissediyorsak int unsigned. İkincisi, standart izin verecek kadar aptal olduğundan "... herhangi bir sırada meydana gelebilir, muhtemelen birbirine karışabilir". Bu, dilin bilinen bir kusuru.

Uygun C kodu kullanır unsigned int.


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.