İşaretli ve işaretsiz int arasındaki fark nedir?
İşaretli ve işaretsiz int arasındaki fark nedir?
Yanıtlar:
Muhtemelen bildiğiniz gibi, inte'ler dahili olarak ikili olarak saklanır. Tipik olarak bir int32 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 intveya a olmasına bağlıdır unsigned int. Bir ile unsigned intdeğ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 ints için en önemli bit, 1ancak ve ancak sayı negatifse. Bu nedenle, signed ints 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 .
intve unsigned intiki farklı tam sayı türüdür. ( intaynı zamanda signed intveya sadece olarak da ifade edilebilir signed; unsigned intolarak da ifade edilebilir unsigned.)
İsimleri ima olarak, intbir olduğunu imzalı tamsayı türü ve unsigned intbir olan işaretsiz tamsayı türü. Bu int, negatif değerleri temsil edebileceği ve unsigned intyalnızca negatif olmayan değerleri temsil edebileceği anlamına gelir .
C dili, bu türlerin aralıklarına bazı gereksinimler getirir. Aralığı inten az -32767.. olmalı +32767ve aralığı unsigned inten 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 inttaş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_MINve 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ü iher 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 isı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 printfC 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");