C ++ 'da imzalanmamış anahtar kelime


88

İşaretsiz anahtar kelime varsayılan olarak C ++ 'da belirli bir veri türünü mi kullanır? Prototip için bir sınıf için bir işlev yazmaya çalışıyorum:

unsigned Rotate(unsigned object, int count)

Ama ne unsignedanlama geldiğini gerçekten anlamıyorum . Gibi unsigned intfalan olması gerekmez mi?

Yanıtlar:


93

Gönderen linke yukarıda:

Bu türlerden birkaçı, işaretli, işaretsiz, kısa ve uzun anahtar kelimeler kullanılarak değiştirilebilir. Bu tür değiştiricilerden biri kendi başına kullanıldığında, int türünün bir veri türü olduğu varsayılır.

Bu, yazarın ints kullandığını varsayabileceğiniz anlamına gelir.


C99 ve MISRA'nın bunu yapmasına izin var mı?
nowox

42

Tamsayı Türleri:

short            -> signed short
signed short
unsigned short
int              -> signed int
signed int
unsigned int
signed           -> signed int
unsigned         -> unsigned int
long             -> signed long
signed long
unsigned long

Dikkatli olun:

char  (is signed or unsigned depending on the implmentation)
signed char
unsigned char

1
@Firas: C içinde olduğunu biliyorum. Implicit int ne ISO C99'un bir parçası ne de ISO C ++ 'nın bir parçası
Prasoon Saurav

4
'İşaretsiz' (tek başına) 'işaretsiz int' türünü bildirmek için kullanmak C ++ 'da standarttır. Mevcut standartta: 7.1.5.2 [dcl.simple.type], her tip bildirimini kullanılan gerçek tiple tanımlayan bir tabloya sahiptir. Bu tablo 'işaretsiz' bildirimden 'işaretsiz int' türüne bir yazışmaya sahiptir.
David Rodríguez - dribeas

2
Char'ın imzalı karakter veya işaretsiz karakter ile aynı davranışa sahip olduğunu , ancak ne olursa olsun ayrı bir tür olarak kaldığını unutmayın.

@Firas: Bkz. Bölüm: 3.9.1 Temel türler. Paragrah 2: <quote> Beş standart işaretli tam sayı türü vardır: "işaretli karakter", "kısa int", "int", "long int" ve "long long int". </quote>
Martin York,

21

İşaretsiz anahtar kelime, C ++ 'da bir veri türü için varsayılan mı?

Evet, imzalı ve imzasız da bağımsız tür belirleyiciler olarak kullanılabilir

Tamsayı veri türleri char, short, long ve int, temsil edilmesi gereken sayı aralığına bağlı olarak işaretli veya işaretsiz olabilir. İşaretli türler hem pozitif hem de negatif değerleri temsil edebilirken, işaretsiz türler yalnızca pozitif değerleri (ve sıfır) temsil edebilir.

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

Bununla birlikte, işaretli ve imzasız da bağımsız tür belirteçleri olarak kullanılabilir, yani sırasıyla işaretli int ve işaretsiz int ile aynıdır. Aşağıdaki iki beyan eşdeğerdir:

unsigned NextYear;
unsigned int NextYear;

3
O halde bu bir "evet" değil mi? Bir tür olmadan kullanılırsa, varsayılan olarak int olur?
gevşeyin

Teşekkür ederim! İngilizce benim ilk dilim değil ve imzasız veri türünün anlamı beni şaşırttı. Kimin imzasını içeriyor? İsim işaretinden olabileceği hiç
aklıma gelmemişti

Anahtar sözcükler shortve longayrıca tür değiştiricilerdir . Eğer yazarsanız short s, bu aslında anlamına gelir short int s, tıpkı unsigned ugerçekte olduğu gibi unsigned int u. (ve unsigned shortanlamı unsigned short int)
Ben Voigt

8

İşaretsiz anahtar kelimeyi C ++ Başvurusu'nda okuyabilirsiniz .

Bu konuda imzalı ve imzasız olmak üzere iki farklı tür vardır. Tamsayılar için varsayılan değer işaretlidir, yani negatif değerlere sahip olabilirler.

32 bitlik bir sistemde bir tamsayı 32 Bit'tir, bu da ~ 4 milyar değer içerebileceği anlamına gelir.

Ve imzalandığında, bu, onu bölmeniz gerektiği anlamına gelir ve -2 milyarı +2 milyara bırakır.

O imzasız zaman ancak değer olamaz bu yüzden tamsayılar için bu +4 milyar 0 anlamına geleceğini, herhangi bir olumsuz numaraları içerir.

Wikipedia'da bununla ilgili biraz daha bilgi var .


2
Ben de çoğu şey için şarkı söylemeyi seviyorum. Nefis karbon ve karbonhidrat!
Omnifarious

1
Yazım hatalarını düzenlemeye ne dersiniz? ... "düzenle" düğmesi bunun için var!
Filip Ekberg

3

Evet, demek unsigned int. Eskiden, C'de bir veri türü belirtmediyseniz, varsayıldığı birçok yer vardı int. Bu, örneğin işlev dönüş türleri denemesiydi.

Bu siğil çoğunlukla ortadan kaldırıldı, ancak burada son kalıntılarıyla karşılaşıyorsunuz. IMHO, unsigned intsadece yaşadığınız karışıklıktan kaçınmak için kodun düzeltilmesi gerekir .

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.