Tam sayı türleri C ++ 'da hangi değer aralığını depolayabilir?


86

Can unsigned long int32 bit bilgisayarda - on basamak sayısını (9999999999 1000000000) tutun?

Ayrıca, aralıkları nelerdir unsigned long int, long int, unsigned int, short int, short unsigned int, ve int?

Yanıtlar:


139

Güvenebileceğiniz minimum aralıklar şunlardır:

  • short intve int: -32.767 - 32.767
  • unsigned short intve unsigned int: 0 - 65.535
  • long int: -2.147.483.647 ile 2.147.483.647
  • unsigned long int: 0 ile 4,294,967,295

Hiçbir, bu araçlar long int değildir güvenilemez bir 10 haneli numara depolamak. Bununla birlikte, long long intC99'da C'ye ve C ++ 11'de C ++ 'ya daha büyük bir tür tanıtıldı (bu tür genellikle, onu içermeyen eski standartlar için oluşturulmuş derleyiciler tarafından bir uzantı olarak desteklenir). Derleyiciniz destekliyorsa, bu tür için minimum aralık:

  • long long int: -9,223,372,036,854,775,807 ile 9,223,372,036,854,775,807
  • unsigned long long int: 0 ile 18,446,744,073,709,551,615

Böylece bu tür yeterince büyük olacaktır (yine, eğer varsa).


Bu alt sınırlarla hata yaptığıma inananlar için bir not - yapmadım. Aralıklar için C gereksinimleri, birinin tamamlayıcı veya işaret büyüklüğü tamsayı temsillerine izin verecek şekilde yazılır, burada en düşük temsil edilebilir değer ve en yüksek temsil edilebilir değer yalnızca işarette farklılık gösterir. Ayrıca, işaret biti 1 ve tüm değer bitleri 0 olan değerin yasal bir değerden ziyade bir tuzak temsili olduğu bir ikinin tümleyen temsiline sahip olmasına da izin verilir . Başka bir deyişle, intbir değil değerini -32.768 temsil edebilmek için gerekli.


Başlık da aslında "C / C ++" diyordu.
caf

neden uzun int pozitif aralık == negatif aralık
mohamed abdallah

1
@mohamedabdallah: Cevabın son paragrafına bakın: C standart aralıkları, kişinin tamamlayıcı veya işaret büyüklüğü temsillerine izin verecek şekildedir.
caf

Aha .. Bunun ne intanlama geldiğini anladım long int.
mazend

32

Sayısal türlerin boyutu, minimum boyutlar olmasına rağmen C ++ standardında tanımlanmamıştır. Platformunuzda hangi boyutta olduklarını söylemenin yolu sayısal limitler kullanmaktır.

Örneğin, bir int için maksimum değer şu şekilde bulunabilir:

std::numeric_limits<int>::max();

Bilgisayarlar, 10 tabanında çalışmaz, bu da , sayıların bellekte temsil edilme şekli nedeniyle maksimum değerin 2 n -1 şeklinde olacağı anlamına gelir . Örneğin sekiz biti (1 bayt) alın

  0100 1000

1 set 2 temsil hakkı en bitlik (sayı) 0 , sonraki bit 2 1 , sonra 2 2 ve bu yüzden sayı imzasız ise en soldaki bit elde edene kadar 2 temsil 7 .

Dolayısıyla sayı 2 6 + 2 3 = 64 + 8 = 72'yi temsil eder , çünkü sağdan 4. bit ve soldan 7. bit sağdan ayarlanır.

Tüm değerleri 1 olarak ayarlarsak:

11111111

Şimdi sayı ( işaretsiz olduğu varsayılarak )
128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255 = 2 8 - 1
Ve gördüğümüz gibi, bu 8 bit ile gösterilebilecek olası en büyük değerdir.

Benim makinemde int ve long aynıdır, her biri -2 31 ile 2 31 - 1 arasında tutabilir. Tecrübelerime göre modern 32 bit masaüstü makinede en yaygın boyut.


Tamsayı türü için minimum boyutlar, ilgili standartlar tarafından zorunlu kılınmıştır (kesin boyutlar olmasa da).
caf

13

Sisteminizdeki sınırları bulmak için :

#include <iostream>
#include <limits>
int main(int, char **) {
  std::cout
    << static_cast< int >(std::numeric_limits< char >::max()) << "\n"
    << static_cast< int >(std::numeric_limits< unsigned char >::max()) << "\n"
    << std::numeric_limits< short >::max() << "\n"
    << std::numeric_limits< unsigned short >::max() << "\n"
    << std::numeric_limits< int >::max() << "\n"
    << std::numeric_limits< unsigned int >::max() << "\n"
    << std::numeric_limits< long >::max() << "\n"
    << std::numeric_limits< unsigned long >::max() << "\n"
    << std::numeric_limits< long long >::max() << "\n"
    << std::numeric_limits< unsigned long long >::max() << "\n";
}

Bunun long longyalnızca C99 ve C ++ 11'de yasal olduğunu unutmayın .


9

Buradaki diğer insanlar veri_ boyutları ve kesinliklere vb. Bağlantılar gönderecek.
Size bunu nasıl çözeceğinizi anlatacağım.
Aşağıdakileri yapacak küçük bir uygulama yazın.

unsigned int ui;
std::cout <<  sizeof(ui));

bu (derleyiciye ve arka plana bağlı olarak) 2, 4 veya 8 yazdıracak, 2 bayt uzunluğunda, 4 bayt uzunluğunda vb.

4 olduğunu varsayalım.

Şimdi 4 baytın depolayabileceği maksimum değeri istiyorsunuz, bir bayt için maksimum değer (onaltılık olarak) 0xFF'dir. Dört baytın maksimum değeri 0x ve ardından 8 f'dir (her bayt için bir çift f, 0x derleyiciye aşağıdaki dizenin onaltılık bir sayı olduğunu söyler). Şimdi bu değeri atamak ve sonucu yazdırmak için programınızı değiştirin

unsigned int ui = 0xFFFFFFFF;
std::cout <<  ui;

Bu, işaretsiz bir int'in tutabileceği, 10 tabanındaki gösterimde gösterilen maksimum değerdir.

Şimdi bunu uzun süre, şortlar ve merak ettiğiniz diğer INTEGER değerleri için yapın.

Not: Bu yaklaşım kayan noktalı sayılar için işe yaramayacaktır (yani çift veya kayan nokta).

Bu yardımcı olur umarım


1
Bunu oturum açarak denerseniz, negatif sayılar alırsınız. "İkinin iltifatını" okuyun (bağlantı sağlanmıştır), bunlar için de tam aralığı (pozitif ve negatif) elde etmek kolaydır. en.wikipedia.org/wiki/Twos_Comparily
Binary Worrier

7

C ++ 'da, artık int ve diğer veriler 2'nin tamamlayıcı yöntemi kullanılarak depolanır. Bu, aralığın:

-2147483648 to 2147483647

veya -2 ^ 31 - 2 ^ 31-1

1 bit 0 için ayrılmıştır, bu nedenle pozitif değer 2 ^ (31) 'den küçüktür


4

Başlık dosyasında bulunan numeric_limits<data_type>::min()ve numeric_limits<data_type>::max()işlevlerini kullanabilir ve limitsher veri türünün sınırlarını bulabilirsiniz.

#include <iostream>
#include <limits>
using namespace std;
int main()
{
    cout<<"Limits of Data types:\n";    
    cout<<"char\t\t\t: "<<static_cast<int>(numeric_limits<char>::min())<<" to "<<static_cast<int>(numeric_limits<char>::max())<<endl;
    cout<<"unsigned char\t\t: "<<static_cast<int>(numeric_limits<unsigned char>::min())<<" to "<<static_cast<int>(numeric_limits<unsigned char>::max())<<endl;
    cout<<"short\t\t\t: "<<numeric_limits<short>::min()<<" to "<<numeric_limits<short>::max()<<endl;
    cout<<"unsigned short\t\t: "<<numeric_limits<unsigned short>::min()<<" to "<<numeric_limits<unsigned short>::max()<<endl;
    cout<<"int\t\t\t: "<<numeric_limits<int>::min()<<" to "<<numeric_limits<int>::max()<<endl;
    cout<<"unsigned int\t\t: "<<numeric_limits<unsigned int>::min()<<" to "<<numeric_limits<unsigned int>::max()<<endl;
    cout<<"long\t\t\t: "<<numeric_limits<long>::min()<<" to "<<numeric_limits<long>::max()<<endl;
    cout<<"unsigned long\t\t: "<<numeric_limits<unsigned long>::min()<<" to "<<numeric_limits<unsigned long>::max()<<endl;
    cout<<"long long\t\t: "<<numeric_limits<long long>::min()<<" to "<<numeric_limits<long long>::max()<<endl;
    cout<<"unsiged long long\t: "<<numeric_limits<unsigned long long>::min()<<" to "<<numeric_limits<unsigned long long>::max()<<endl;
    cout<<"float\t\t\t: "<<numeric_limits<float>::min()<<" to "<<numeric_limits<float>::max()<<endl;
    cout<<"double\t\t\t: "<<numeric_limits<double>::min()<<" to "<<numeric_limits<double>::max()<<endl;
    cout<<"long double\t\t: "<<numeric_limits<long double>::min()<<" to "<<numeric_limits<long double>::max()<<endl;
}

Çıktı şu olacaktır: Veri türlerinin sınırları:

  • char: -128 ila 127
  • işaretsiz karakter: 0-255
  • kısa: -32768 ila 32767
  • işaretsiz kısa: 0 - 65535
  • int: -2147483648 ila 2147483647
  • işaretsiz int: 0 - 4294967295
  • uzun: -2147483648 ila 2147483647
  • unsigned long: 0 - 4294967295
  • uzun uzun: -9223372036854775808 ila 9223372036854775807
  • unsigned long: 0 to 18446744073709551615
  • şamandıra: 1.17549e-038 - 3.40282e + 038
  • çift: 2.22507e-308 - 1.79769e + 308
  • uzun çift: 3,3621e-4932 ila 1,18973e + 4932

2

İçin işaretsiz veri türü bir işaret biti olduğu ve tüm bitler veriler için olan; için ise imza veri türü MSB belirtilen işaret bitini ve kalan bit veri bulunmaktadır.

Aralığı bulmak için aşağıdakileri yapın:

Adım: 1 -> Verilen veri türü için bayt sayısını bulun.

Adım: 2 -> Aşağıdaki hesaplamaları uygulayın.

      Let n = no of bits in data type  

      For signed data type ::
            Lower Range = -(2^(n-1)) 
            Upper Range = (2^(n-1)) - 1)  

      For unsigned data type ::
            Lower Range = 0 
            Upper Range = (2^(n)) - 1 

Örneğin

İşaretsiz int boyutu için = 4 bayt (32 bit) -> Aralık [0, (2 ^ (32)) - 1]

İşaretli int boyutu için = 4 bayt (32 bit) -> Aralık [- (2 ^ (32-1)), (2 ^ (32-1)) - 1]



0

Belirli bir tür için numeric_limits <> şablonunun uzmanlıklarına bakmalısınız. Başlıkta.


0

İmzasız uzun int, 32 bitlik bir bilgisayarda on basamaklı bir sayı (1.000.000.000 - 9.999.999.999) tutabilir.

Hayır

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.