Bisa unsigned long int
menyimpan sepuluh digit angka (1.000.000.000 - 9.999.999.999) di komputer 32-bit?
Selain itu, apa yang rentang unsigned long int
, long int
, unsigned int
, short int
, short unsigned int
, dan int
?
Jawaban:
The minimum berkisar Anda dapat mengandalkan adalah:
short int
dan int
: -32.767 hingga 32.767unsigned short int
dan unsigned int
: 0 hingga 65.535long int
: -2.147.483.647 menjadi 2.147.483.647unsigned long int
: 0 hingga 4.294.967.295Ini berarti tidak, long int
tidak dapat diandalkan untuk menyimpan 10 digit angka. Namun, tipe yang lebih besar long long int
diperkenalkan ke C di C99 dan C ++ di C ++ 11 (tipe ini juga sering didukung sebagai ekstensi oleh kompiler yang dibuat untuk standar lama yang tidak menyertakannya). Rentang minimum untuk tipe ini, jika kompiler Anda mendukungnya, adalah:
long long int
: -9.223.372.036.854.775.807 hingga 9.223.372.036.854.775.807unsigned long long int
: 0 sampai 18.446.744.073.709.551.615Jadi tipe itu akan cukup besar (sekali lagi, jika Anda memilikinya).
Sebuah catatan untuk mereka yang percaya bahwa saya telah membuat kesalahan dengan batas bawah ini - saya belum melakukannya. Persyaratan C untuk rentang ditulis untuk memungkinkan representasi bilangan bulat komplemen atau magnitudo tanda, di mana nilai terwakili terendah dan nilai terwakili tertinggi hanya berbeda pada tanda. Juga diperbolehkan untuk memiliki representasi komplemen dua di mana nilai dengan tanda bit 1 dan semua bit nilai 0 adalah representasi perangkap daripada nilai legal. Dengan kata lain, int
yang tidak diperlukan untuk dapat mewakili nilai -32.768.
int
artinya long int
.
Ukuran tipe numerik tidak ditentukan dalam standar C ++, meskipun ukuran minimumnya ditentukan. Cara untuk mengetahui ukuran mereka di platform Anda adalah dengan menggunakan batas numerik
Misalnya, nilai maksimum untuk sebuah int dapat ditemukan dengan:
std::numeric_limits<int>::max();
Komputer tidak bekerja pada basis 10, yang berarti nilai maksimalnya berupa 2 n -1 karena banyaknya bilangan yang terwakili dalam memori. Ambil contoh delapan bit (1 byte)
0100 1000
Bit (bilangan) paling kanan saat diset ke 1 mewakili 2 0 , bit berikutnya 2 1 , lalu 2 2 dan seterusnya sampai kita sampai ke bit paling kiri yang jika bilangan unsigned mewakili 2 7 .
Jadi angka tersebut mewakili 2 6 + 2 3 = 64 + 8 = 72, karena bit ke-4 dari kanan dan bit ke-7 dari kanan kiri ditetapkan.
Jika kita mengatur semua nilai menjadi 1:
11111111
Jumlahnya sekarang (dengan asumsi unsigned )
128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255 = 2 8 - 1
Dan seperti yang bisa kita lihat, itu adalah kemungkinan nilai terbesar yang dapat direpresentasikan dengan 8 bit.
Pada mesin saya dan int dan long adalah sama, masing-masing dapat menampung antara -2 31 hingga 2 31 - 1. Dalam pengalaman saya, ukuran paling umum pada mesin desktop 32 bit modern.
Untuk mengetahui batasan pada sistem Anda :
#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";
}
Perhatikan bahwa long long
hanya legal di C99 dan C ++ 11.
Orang lain di sini akan memposting tautan ke data_sizes dan presisi, dll.
Saya akan memberi tahu Anda cara mengetahuinya sendiri.
Tulis aplikasi kecil yang akan melakukan hal berikut.
unsigned int ui;
std::cout << sizeof(ui));
ini akan (tergantung pada compiler dan archicture) mencetak 2, 4 atau 8, mengatakan panjang 2 byte, panjang 4 byte, dll.
Mari kita asumsikan itu 4.
Anda sekarang ingin nilai maksimum yang dapat disimpan 4 byte, nilai maksimal untuk satu byte adalah (dalam hex) 0xFF. Nilai maksimal empat byte adalah 0x diikuti oleh 8 f (sepasang f untuk setiap byte, 0x memberi tahu kompiler bahwa string berikut adalah nomor hex). Sekarang ubah program Anda untuk menetapkan nilai itu dan mencetak hasilnya
unsigned int ui = 0xFFFFFFFF;
std::cout << ui;
Itulah nilai maksimal yang dapat dimiliki oleh unsigned int, yang ditunjukkan dalam representasi basis 10.
Sekarang lakukan itu untuk jangka panjang, celana pendek dan nilai INTEGER lainnya yang membuat Anda penasaran.
NB: Pendekatan ini tidak akan bekerja untuk bilangan floating point (yaitu ganda atau float).
Semoga ini membantu
Di C ++, sekarang int dan data lainnya disimpan menggunakan metode pujian 2. Artinya kisarannya adalah:
-2147483648 to 2147483647
atau -2 ^ 31 hingga 2 ^ 31-1
1 bit dicadangkan untuk 0 jadi nilai positif kurang dari 2 ^ (31)
Anda dapat menggunakan fungsi numeric_limits<data_type>::min()
dan yang numeric_limits<data_type>::max()
ada di limits
file header dan menemukan batasan dari setiap tipe data.
#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;
}
Outputnya adalah: Batasan tipe Data:
Untuk tipe data unsigned tidak ada bit tanda dan semua bit untuk data; sedangkan untuk tipe data bertanda tangan MSB diindikasikan bit tanda dan bit yang tersisa untuk data.
Untuk menemukan kisaran lakukan hal-hal berikut:
Langkah: 1 -> Cari tahu tidak ada byte untuk tipe data yang diberikan.
Langkah: 2 -> Terapkan perhitungan berikut.
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
Misalnya
Untuk unsigned int size = 4 byte (32 bits) -> Range [0, (2 ^ (32)) - 1]
Untuk ukuran int bertanda = 4 byte (32 bit) -> Range [- (2 ^ (32-1)), (2 ^ (32-1)) - 1]
Tidak, hanya sebagian dari sepuluh digit angka yang dapat disimpan dalam long int unsigned yang rentang validnya adalah 0 hingga 4,294,967,295. Anda dapat merujuk ke ini: http://msdn.microsoft.com/en-us/library/s3f49ktz(VS.80).aspx
Anda harus melihat spesialisasi template numeric_limits <> untuk tipe tertentu. Ada di header.