İşaretli ve işaretsiz int arasındaki fark nedir?
İşaretli ve işaretsiz int arasındaki fark nedir?
Yanıtlar:
Muhtemelen bildiğiniz gibi, int
e'ler dahili olarak ikili olarak saklanır. Tipik olarak bir int
32 bit içerir, ancak bazı ortamlarda 16 veya 64 bit (veya hatta farklı bir sayı, genellikle ancak ikinin kuvveti olması gerekmez) içerebilir.
Ancak bu örnek için 4 bitlik tam sayılara bakalım. Küçük, ancak açıklama amacıyla kullanışlıdır.
Böyle bir tamsayıda dört bit olduğundan, 16 değerden birini alabilir; 16'nın ikiye dördüncü kuvveti veya 2 çarpı 2 çarpı 2 çarpı 2. Bu değerler nelerdir? Cevap, bu tam sayının a signed int
veya a olmasına bağlıdır unsigned int
. Bir ile unsigned int
değer hiçbir zaman negatif değildir; değerle ilişkili bir işaret yok. İşte dört bitin 16 olası değeri unsigned int
:
bits value
0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 8
1001 9
1010 10
1011 11
1100 12
1101 13
1110 14
1111 15
... ve İşte dört bitin 16 olası değeri signed int
:
bits value
0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 -8
1001 -7
1010 -6
1011 -5
1100 -4
1101 -3
1110 -2
1111 -1
Gördüğünüz gibi, signed int
s için en önemli bit, 1
ancak ve ancak sayı negatifse. Bu nedenle, signed int
s için bu bit "işaret biti" olarak bilinir.
(unsigned)(-1)
için geçerli olmayan unsigned
(ikili gösterimden bağımsız) maksimum temsil edilebilir değer olması gerekir .
int
ve unsigned int
iki farklı tam sayı türüdür. ( int
aynı zamanda signed int
veya sadece olarak da ifade edilebilir signed
; unsigned int
olarak da ifade edilebilir unsigned
.)
İsimleri ima olarak, int
bir olduğunu imzalı tamsayı türü ve unsigned int
bir olan işaretsiz tamsayı türü. Bu int
, negatif değerleri temsil edebileceği ve unsigned int
yalnızca negatif olmayan değerleri temsil edebileceği anlamına gelir .
C dili, bu türlerin aralıklarına bazı gereksinimler getirir. Aralığı int
en az -32767
.. olmalı +32767
ve aralığı unsigned int
en az 0
.. olmalıdır 65535
. Bu, her iki türün de en az 16 bit olması gerektiği anlamına gelir. Birçok sistemde 32 bit, hatta bazılarında 64 bittir. int
Çoğu modern sistem tarafından kullanılan ikinin tamamlayıcı gösterimi nedeniyle genellikle ekstra bir negatif değere sahiptir.
Belki de en önemli fark, işaretli ve işaretsiz aritmetiğin davranışıdır. İmzalandığında int
, taşma tanımsız davranışa sahiptir. Çünkü unsigned int
taşma yok; örneğin, türün aralığı dışında bir değer veren herhangi bir işlem etrafını sarar UINT_MAX + 1U == 0U
.
İşaretli veya işaretsiz herhangi bir tam sayı türü, matematiksel tam sayıların sonsuz kümesinin bir alt aralığını modeller. Bir tür aralığındaki değerlerle çalıştığınız sürece, her şey çalışır. Bir türün alt veya üst sınırına yaklaştığınızda, bir süreksizlikle karşılaşırsınız ve beklenmedik sonuçlar elde edebilirsiniz. İşaretli tam sayı türleri için, sorunlar yalnızca çok büyük negatif ve pozitif değerler için ortaya çıkar, INT_MIN
ve INT_MAX
. İşaretsiz tamsayı türleri için, çok büyük pozitif değerler için ve sıfırda sorunlar oluşur . Bu bir hata kaynağı olabilir. Örneğin, bu sonsuz bir döngüdür:
for (unsigned int i = 10; i >= 0; i --) [
printf("%u\n", i);
}
çünkü i
her zaman sıfırdan büyük veya sıfıra eşittir; imzasız türlerin doğası budur. (Döngünün içinde i
sıfır olduğunda i--
değerini olarak ayarlar UINT_MAX
.)
Bazen, belirli bir tamsayı değişkeninde depolanan değerin her zaman pozitif olacağını önceden biliyoruz - örneğin, yalnızca şeyleri saymak için kullanıldığında. Böyle bir durumda değişkeni, 'de olduğu gibi işaretsiz olarak ilan edebiliriz unsigned int num student;
. Böyle bir bildirimle, izin verilen tam sayı değerleri aralığı (32 bitlik bir derleyici için) -2147483648 ila +2147483647 aralığından 0 ila 4294967295 aralığına kayacaktır. Bu nedenle, bir tamsayıyı işaretsiz olarak bildirmek, mümkün olan en büyük boyutun neredeyse iki katına çıkar. aksi takdirde tutabileceği değer.
Laymen'in terimleriyle, işaretsiz bir tamsayı, negatif olamayan ve bu nedenle alabileceği daha yüksek bir pozitif değerler aralığına sahip bir tam sayıdır. İşaretli bir tamsayı, negatif olabilen, ancak alabileceği daha negatif değerler karşılığında daha düşük bir pozitif aralığa sahip olan bir tamsayıdır.
Pratikte iki fark vardır:
cout
, C ++ veya printf
C ile): işaretsiz tamsayı bit gösterimi, yazdırma işlevleri tarafından negatif olmayan bir tam sayı olarak yorumlanır.bu kod, tamsayıyı sıralama kriterini kullanarak tanımlayabilir:
char a = 0;
a--;
if (0 < a)
printf("unsigned");
else
printf("signed");