Rentang nilai apa yang dapat disimpan tipe integer di C ++

86

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?

yihangho
sumber

Jawaban:

139

The minimum berkisar Anda dapat mengandalkan adalah:

  • short intdan int: -32.767 hingga 32.767
  • unsigned short intdan unsigned int: 0 hingga 65.535
  • long int: -2.147.483.647 menjadi 2.147.483.647
  • unsigned long int: 0 hingga 4.294.967.295

Ini berarti tidak, long int tidak dapat diandalkan untuk menyimpan 10 digit angka. Namun, tipe yang lebih besar long long intdiperkenalkan 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.807
  • unsigned long long int: 0 sampai 18.446.744.073.709.551.615

Jadi 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, intyang tidak diperlukan untuk dapat mewakili nilai -32.768.

kafe
sumber
Judul aslinya juga mengatakan "C / C ++".
caf
mengapa long long int positive range == negative range
mohamed abdallah
1
@mohamedabdallah: Lihat paragraf terakhir dari jawaban: rentang standar C adalah cara untuk memungkinkan representasi pelengkap atau besaran tanda seseorang.
kafe
Aha..aku menyadari itu intartinya long int.
mazend
32

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.

Yacoby
sumber
Ukuran minimum untuk tipe integer diamanatkan oleh standar yang relevan (meskipun ukuran yang tepat tidak).
kafe
13

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 longhanya legal di C99 dan C ++ 11.

Hal Canary
sumber
9

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

Biner Worrier
sumber
1
Jika Anda mencoba ini dengan int bertanda tangan, Anda mendapatkan angka negatif. Baca tentang "pujian dua" (tautan tersedia), mudah untuk mendapatkan rangkaian lengkap (positif dan negatif) untuk ini juga. en.wikipedia.org/wiki/Twos_Compliment
Binary Worrier
7

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)

Shah Rukh Qasim
sumber
4

Anda dapat menggunakan fungsi numeric_limits<data_type>::min()dan yang numeric_limits<data_type>::max()ada di limitsfile 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:

  • char: -128 hingga 127
  • unsigned char: 0 hingga 255
  • short: -32768 hingga 32767
  • unsigned short: 0 hingga 65535
  • int: -2147483648 hingga 2147483647
  • unsigned int: 0 hingga 4294967295
  • long: -2147483648 hingga 2147483647
  • unsigned long: 0 hingga 4294967295
  • long long: -9223372036854775808 hingga 9223372036854775807
  • unsigned long long: 0 hingga 18446744073709551615
  • float: 1.17549e-038 hingga 3.40282e + 038
  • ganda: 2.22507e-308 hingga 1.79769e + 308
  • long double: 3.3621e-4932 hingga 1.18973e + 4932
insearchofcode
sumber
2

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]

Ashish
sumber
0

Anda harus melihat spesialisasi template numeric_limits <> untuk tipe tertentu. Ada di header.

PaulJWilliams
sumber
0

Dapat unsigned long int memegang sepuluh digit angka (1.000.000.000 - 9.999.999.999) pada komputer 32-bit.

Tidak

justin
sumber