web-gelistirme-sc.com

Kısa bir tipin C'de saklayabileceği maksimum ve minimum sayılar nedir?

C'deki veri türlerini kavramakta zorlanıyorum. Bir C kitabından geçiyorum ve zorluklardan biri bir short 'in saklayabileceği maksimum ve minimum sayının ne olduğunu soruyor.

sizeof(short); işlevini kullanarak kısa bir süre 2 bayt tükettiğini görebiliyorum. Bu, 16 bittiği anlamına gelir; bu, bir sayının ikili gösterimini saklamak için 8 bittiği için iki sayı anlamına gelir. Örneğin, 9 bir biti dolduran 00111001 olacaktır. Öyleyse imzasızlar için 0'dan 99'a ve -9'dan 9'a imzalanmadı mı?

Yanıldığımı biliyorum ama neden olduğundan emin değilim. Burada en fazla (-) imzalılar için 32.767 ve imzasızlar için 65.535 olduğunu belirtir.

kısa int, 2 Bayt, 16 Bit, -32,768 -> +32,767 Aralık (16kb)

9
Mohamad

Bir saniye için ondalık olarak düşünün. Bir sayı için yalnızca 2 haneniz varsa, bu, bunlarda 00 - 99 adreslerini saklayabileceğiniz anlamına gelir. 4 haneniz varsa, bu aralık 0000 - 9999 olur.

İkili sayı ondalık basamağa benzer, ancak rakamlar 0, 1, 0, 1, ..., 2 yerine yalnızca 3 ve 9 olabilir.

Böyle bir numaranız varsa:

01011101

Bu:

0*128 + 1*64 + 0*32 + 1*16 + 1*8 + 1*4 + 0*2 + 1*1 = 93

Gördüğünüz gibi 9 değerinden daha büyük değerleri bir baytta saklayabilirsiniz. İmzasız 8 bitlik bir sayıda, aslında 00000000 ile 11111111 arasındaki değerleri, ondalık değerinde 255 olan saklayabilirsiniz.

2 baytlık bir sayı olarak, bu aralık 00000000 00000000'dan 11111111 11111111'a kadar olur ve bu 65535 olur.

"Bir sayının ikili gösterimini saklamak için 8 bit sürer" ifadeniz "doğru olmayan bir sayının ondalık gösterimini saklamak için 8 rakam alır" demektir. Örneğin, 12345678901234567890 numarasının 8 rakamdan fazlası vardır. Aynı şekilde, 8 bitte all sayılarına sığamazsınız, ancak bunlardan sadece 256'sı sığamaz. Bu nedenle 2-byte (shortname__), 4-byte (intname__) ve 8-byte (long long) sayıları alırsınız. Aslında, daha fazla sayıya ihtiyacınız varsa, bir kütüphane kullanmanız gerekir.

Negatif sayılar söz konusu olduğu sürece, 2'li bir tamamlayıcı bilgisayarda, bu aralığın yüksek yarısını negatif değerler olarak kullanmak için bir kuraldır. Bu, sol tarafta 1 olan sayıların negatif olduğu anlamına gelir.

Bununla birlikte, bu sayılar uyumlu modulo 256 (modulo 2^n, nbit), sayının önerdiği gibi pozitif değerlerine sahiptir. Örneğin, imzalı değilse 11111111 sayısı 255 ve imzalanmışsa -1 olan uyumlu modulo 256'dır.

16
Shahbaz

Bu, <limits.h> içinde tanımlanmıştır ve SHRT_MIN & SHRT_MAX şeklindedir.

7

Okuduğunuz referans doğru. En azından, short öğesinin 16 bit olduğu normal C uygulamaları için - bu standartta sabit değildir.

16 bit, 2 ^ 16 olası bit desenine sahip olabilir, bu 65536 olasılıktır. İşaretli şort -32768 - 32767, işaretsiz şort 0 - 65535 arasındadır.

7
Keith Randall

Diğerleri sizin için oldukça iyi çözümler yayınladılar, ancak düşüncelerinizi takip ettiklerini ve nerede hata yaptığınızı açıkladıklarını sanmıyorum. Yapmaya çalışacağım.

Kısa bir süre 2 bayt tükettiğini görebiliyorum. Bunun anlamı 16 bit. 

Bu noktaya kadar haklısınız (short'nin int gibi 2 bayt uzunluğunda olması garanti edilmese de, 4 olması garanti edilmese de - standart olarak tek garantili boyut (doğru hatırlıyorsam) char, her zaman 1 byte genişliğinde olmalıdır).

bu, bir sayının ikili gösterimini saklamak için 8 bit aldığı için iki sayı anlamına gelir.

Buradan biraz kaymaya başladın. Bir numarayı kaydetmek 8 bit gerektirmez. Bir numaraya bağlı olarak, depolamak 16, 32 64 veya daha fazla bit alabilir. 16 bitinizi 2'ye bölmek yanlıştır. Bir CPU uygulamasının özelliği olmasaydı, örneğin 2 bit sayı alabilirdik. Bu durumda, bu iki bit aşağıdaki gibi değerleri depolayabilir:

00 - 0 in decimal
01 - 1 in decimal
10 - 2 in decimal
11 - 3 in decimal

4'ü depolamak için 3 bite ihtiyacımız var. Ve böylece değer bir taşma neden "uygun" olmaz. Aynısı 16 bitlik numara için de geçerlidir. Örneğin, 16 bitte depolanan ondalık sayısında "255" i imzasız hale getirdiğimizi varsayalım, ikili gösterimi 0000000011111111 olacaktır. Bu sayıya 1 eklediğinizde, 0000000100000000 (ondalık sayıdaki 256) olur. Bu yüzden sadece 8 bitiniz olsaydı, taşar ve 0 olur, çünkü en önemli bit atılırdı.

Şimdi, 16 bitlik bellekte alabileceğiniz maksimum işaretsiz sayı - ondalık sayıdaki 65535 olan - 1111111111111111. Başka bir deyişle, işaretsiz numaralar için - tüm bitleri 1 olarak ayarlayın ve bu size mümkün olan maksimum değeri verecektir.

Bununla birlikte, işaretli sayılar için en önemli bit, pozitif için 0, negatif için 1 işaretidir. Negatif için, maksimum değer 10 tabanındaki -32678 olan 1000000000000000'dur. İmzalı ikili gösterime ilişkin kurallar iyi tanımlanmıştır here .

Umarım yardımcı olur!

3
user405725

İmzasız bir ikili sayının aralığını bulma formülü:

2 ^ (sizeof(type)*8)
0
Linuxios