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.