Can unsigned long int
32 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:
Güvenebileceğiniz minimum aralıklar şunlardır:
short int
ve int
: -32.767 - 32.767unsigned short int
ve unsigned int
: 0 - 65.535long int
: -2.147.483.647 ile 2.147.483.647unsigned long int
: 0 ile 4,294,967,295Hiçbir, bu araçlar long int
değildir güvenilemez bir 10 haneli numara depolamak. Bununla birlikte, long long int
C99'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,807unsigned long long int
: 0 ile 18,446,744,073,709,551,615Bö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, int
bir değil değerini -32.768 temsil edebilmek için gerekli.
int
anlama geldiğini anladım long int
.
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.
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 long
yalnızca C99 ve C ++ 11'de yasal olduğunu unutmayın .
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
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
Başlık dosyasında bulunan numeric_limits<data_type>::min()
ve numeric_limits<data_type>::max()
işlevlerini kullanabilir ve limits
her 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ı:
İç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]
Hayır, on basamaklı sayının yalnızca bir kısmı, geçerli aralığı 0 ila 4,294,967,295 olan işaretsiz bir uzun int içinde saklanabilir. buna başvurabilirsiniz: http://msdn.microsoft.com/en-us/library/s3f49ktz(VS.80).aspx
Belirli bir tür için numeric_limits <> şablonunun uzmanlıklarına bakmalısınız. Başlıkta.