nilai maks integer

291

Dalam C, integer (untuk mesin 32 bit) adalah 32 bit, dan berkisar antara -32.768 hingga +32.767. Di Jawa, integer (panjang) juga 32 bit, tetapi berkisar dari -2.147.483.648 hingga +2.147.482.447.

Saya tidak mengerti bagaimana jangkauannya berbeda di Jawa, meskipun jumlah bitnya sama. Adakah yang bisa menjelaskan hal ini?

stackuser
sumber
35
Untuk mendapatkan nilai maksimum dan minimum int di Jawa, gunakan Integer.MAX_VALUE dan Integer.MIN_VALUE
live-love
5
@stackuser - Beberapa jawaban bagus untuk pertanyaan Anda - Anda harus menerimanya :)
Darragh Enright
2
@DarraghEnright dia terakhir terlihat pada Maret 2015, saya ragu dia akan kembali :(
Ungeheuer
4
@Adrian haha ​​- kurasa tidak! Saya kira terjadi sedikit. Saya selalu membayangkan bahwa SO dapat dengan mudah menerima jawaban dalam kondisi tertentu - di mana pertanyaannya sudah melampaui usia tertentu, OP adalah AWOL dan ada jawaban yang jelas berguna dengan jumlah upvote yang tinggi.
Darragh Enright
2
@DarraghEnright Setuju. Tapi OP ada di sini ~ 2 minggu yang lalu, dia punya kesempatan untuk menerima, jadi secara teknis dia tidak pergi.
gaborsch

Jawaban:

392

Dalam C , bahasa itu sendiri tidak menentukan representasi tipe data tertentu. Ini dapat bervariasi dari satu mesin ke mesin lainnya, pada sistem embedded intdapat lebar 16 bit, meskipun biasanya 32 bit.

Satu-satunya persyaratan adalah bahwa short int<= int<= long intberdasarkan ukuran. Juga, ada rekomendasi yang intharus mewakili kapasitas asli prosesor .

Semua tipe sudah ditandatangani. The unsignedpengubah memungkinkan Anda untuk menggunakan bit tertinggi sebagai bagian dari nilai (jika tidak dicadangkan untuk bit tanda).

Berikut adalah tabel pendek dari nilai yang mungkin untuk tipe data yang mungkin:

          width                     minimum                         maximum
signed    8 bit                        -128                            +127
signed   16 bit                     -32 768                         +32 767
signed   32 bit              -2 147 483 648                  +2 147 483 647
signed   64 bit  -9 223 372 036 854 775 808      +9 223 372 036 854 775 807
unsigned  8 bit                           0                            +255
unsigned 16 bit                           0                         +65 535
unsigned 32 bit                           0                  +4 294 967 295
unsigned 64 bit                           0     +18 446 744 073 709 551 615

Di Jawa , yang Java Language Specification menentukan representasi dari tipe data.

Urutannya adalah: byte8 bit, short16 bit, int32 bit, long64 bit. Semua jenis ini ditandatangani , tidak ada versi yang tidak ditandatangani. Namun, manipulasi bit memperlakukan angka-angka seperti yang tidak ditandatangani (yaitu, menangani semua bit dengan benar).

Tipe data karakter charadalah lebar 16 bit, tidak bertanda , dan menampung karakter menggunakan pengkodean UTF-16 (namun, dimungkinkan untuk menetapkan charbilangan bulat 16 bit yang tidak ditandatangani yang mewakili kode karakter yang tidak valid)

          width                     minimum                         maximum

SIGNED
byte:     8 bit                        -128                            +127
short:   16 bit                     -32 768                         +32 767
int:     32 bit              -2 147 483 648                  +2 147 483 647
long:    64 bit  -9 223 372 036 854 775 808      +9 223 372 036 854 775 807

UNSIGNED
char     16 bit                           0                         +65 535
gaborsch
sumber
10
Standar C juga menentukan nilai minimum untuk INT_MAX, LONG_MAX, dll.
Oliver Charlesworth
13
Java 8 sekarang memiliki bilangan bulat
Jakub Kotowski
4
Terima kasih, @jkbkot, senang mengetahuinya. Meskipun tampaknya representasi masih ditandatangani, tetapi beberapa operasi yang tidak ditandatangani diimplementasikan sebagai fungsi. Sulit untuk menambahkan dua ints unsigned ...
gaborsch
5
@ GaborSch Di Jawa, int foo = Integer.MAX_VALUE + 1; System.out.println(Integer.toUnsignedLong(foo));cetakan 2147483648dan karakter adalah tipe unsigned
howlger
2
@ howlger Integer.MAX_VALUE + 1ada 0x80000000di hex, karena overflow (dan sama dengan Integer.MIN_VALUE). Jika Anda mengonversinya menjadi unsigned (long), bit tanda akan diperlakukan seperti bit nilai, jadi itu akan menjadi 2147483648. Terima kasih atas charcatatannya. chartidak ditandatangani, Anda benar, tetapi char tidak benar-benar digunakan untuk perhitungan, itu sebabnya saya meninggalkannya dari daftar.
gaborsch
72

Dalam C, integer (untuk mesin 32 bit) adalah 32 bit dan berkisar antara -32768 hingga +32767.

Salah. Integer bertanda 32-bit dalam representasi pelengkap 2 memiliki kisaran -2 31 hingga 2 31 -1 yang sama dengan -2.147.483.648 hingga 2.147.483.647.

Kos
sumber
3
Saya memperbaiki eksponensial Anda, **bahkan tidak C dan tidak terlalu jelas menurut saya. :)
bersantai
2
Terlihat lebih baik sekarang, terima kasih! Terlalu banyak Python, kurasa. Saya menghindari ^karena biasanyaxor
Kos
5
Saya pikir maksud saya adalah karena C tidak memiliki operator eksponensial, saya tidak berpikir bahwa bagian tertentu harus diformat sebagai kode sama sekali. :)
bersantai
19

Bilangan bulat 32 bit berkisar dari -2.147.483.648 hingga 2.147.483.647. Namun fakta bahwa Anda menggunakan mesin 32-bit tidak berarti Ckompiler Anda menggunakan bilangan bulat 32-bit.

Ivaylo Strandjev
sumber
1
Setidaknya salinan Tn. Kernighan dan Tn. Ritchies "Bahasa pemrograman C" mengatakan dalam A4.2 yang intmerupakan "lebar alami mesin" yang akan saya artikan sebagai 32 bit saat menyusun untuk mesin 32 bit.
junix
7
Ini tergantung pada kompiler, bukan mesin yang saya percaya. Saya memiliki kompiler 16 bit yang diinstal pada mesin 64 bit saya misalnya.
Ivaylo Strandjev
Tentu saja kompiler 16 bit Anda untuk kode x86 16 bit hanya menggunakan 16 bit. Tapi itu bukan poin saya. Bahkan prosesor x86 32 bit yang berjalan dalam mode 16 bit hanya memiliki kapasitas asli yang hanya 16 bit. Maksud saya adalah bahwa platform target memiliki masalah. Misalnya jika Anda memiliki kompiler untuk 80286 Anda, Anda masih akan menghasilkan kode 16-bit dan karenanya memiliki bilangan bulat 16 bit.
junix
2
@Junix Saya percaya itulah yang saya tunjukkan dalam jawaban saya. Bukan OS yang menentukan berapa bit yang dimiliki integer Anda. Platform target adalah properti dari kompiler, bukan OS yang sedang dikerjakannya atau prosesor yang Anda miliki.
Ivaylo Strandjev
Seperti yang saya tulis di komentar pertama saya. "Ini 32-bit ketika mengkompilasi untuk mesin 32 bit". OP menulis dalam postingannya "integer (untuk mesin 32 bit)" Jadi dari apa yang saya pahami dia tidak merujuk ke OS-nya, atau mesinnya, dia merujuk pada platform targetnya
junix
15

Definisi bahasa C menentukan rentang minimum untuk berbagai tipe data. Sebab int, kisaran minimum ini adalah -32767 hingga 32767, yang berarti intharus memiliki lebar minimal 16 bit. Implementasi gratis untuk menyediakan inttipe yang lebih luas dengan rentang yang lebih luas. Misalnya, pada server pengembangan SLES 10 tempat saya bekerja, kisarannya adalah -2147483647 hingga 2137483647.

Masih ada beberapa sistem di luar sana yang menggunakan inttipe 16-bit (All The World Bukan A VAX x86), tetapi ada banyak yang menggunakan inttipe 32-bit , dan mungkin beberapa yang menggunakan 64-bit.

Bahasa C dirancang untuk dijalankan pada arsitektur yang berbeda. Java dirancang untuk dijalankan dalam mesin virtual yang menyembunyikan perbedaan arsitektur tersebut.

John Bode
sumber
Untuk int 16-bit, itu adalah -3276 8 hingga 32767. Untuk int 32-bit, itu adalah -214748364 8 hingga 2147483647. Kisaran ditentukan dari -2 ^ (n bit-1) hingga + 2 ^ (n bits-1 ) - 1.
mythicalcoder
3
@ David: 5.2.4.2.1 - INT_MINditentukan sebagai -32767. Jangan menganggap komplemen dua.
John Bode
8

Setara ketat dari java intadalah long intdalam C.

Sunting: Jika int32_tdidefinisikan, maka itu setara dalam hal presisi. long intmenjamin ketepatan java int, karena dijamin ukurannya setidaknya 32 bit.

UmNyobe
sumber
Anda benar, padanannya adalah int32_tjika ditentukan oleh kompiler Anda
UmNyobe
7

Itu karena dalam C - integer pada mesin 32 bit tidak berarti bahwa 32 bit digunakan untuk menyimpannya, itu mungkin 16 bit juga. Itu tergantung pada mesin (tergantung implementasi).

BlueLettuce16
sumber
1
Yah, perlu dicatat bahwa perilaku implementasi yang umum menggunakan "lebar mesin" untuk int. Tapi limits.h
tolong
3
Tetapi pada kenyataannya, saya tidak berpikir C compiler untuk 32 pernah dibuat tanpa int sebagai 32 bit. Standar ini memungkinkan implementasi kompiler int menjadi sifat moron, tetapi karena beberapa alasan, tidak ada yang mau membuat kompiler moronik C. Trennya adalah membuat kompiler C yang bermanfaat.
Lundin
4

Sebenarnya ukuran dalam bit dari int, short, long tergantung pada pelaksanaan compiler.

Misalnya pada Ubuntu 64 bit saya ada shortdalam 32bit, ketika pada versi Ubuntu 32bit yang lain itu 16bit.

Alex
sumber
2

Ini sebenarnya sangat sederhana untuk dipahami, Anda bahkan dapat menghitungnya dengan kalkulator google: Anda memiliki 32 bit untuk int dan komputer adalah biner, oleh karena itu Anda dapat memiliki 2 nilai per bit (tempat). jika Anda menghitung 2 ^ 32 Anda akan mendapatkan 4.294.967.296. jadi jika Anda membagi angka ini dengan 2, (karena setengah dari mereka adalah bilangan bulat negatif dan setengah lainnya adalah positif), maka Anda mendapatkan 2.147.483.648. dan angka ini adalah int terbesar yang dapat diwakili oleh 32 bit, meskipun jika Anda perhatikan Anda akan melihat bahwa 2.147.483.648 lebih besar dari 2.147.483.647 oleh 1, ini karena salah satu angka mewakili 0 yang tepat di tengah sayangnya 2 ^ 32 bukan bilangan ganjil karena itu Anda tidak hanya memiliki satu angka di tengah, sehingga bilangan bulat yang dimiliki memiliki satu cipher yang lebih sedikit sedangkan yang negatif mendapatkan setengah lengkap 2.147.483.648.

Dan itu saja. Itu tergantung pada mesin bukan pada bahasa.

Emos Turi
sumber
2
Ini bukan yang dia tanyakan ... pertanyaannya adalah "mengapa C int berbeda dari Java int?"
ElectronWill
Dan di Jawa, ukuran int tidak tergantung pada mesin. int== Ditandatangani 32-bit, pelengkap dua ditentukan oleh spesifikasi bahasa Java, dan diukir pada lembaran unobtainium anodized . (Oke, mungkin bukan yang terakhir.)
Stephen C
1

Dalam rentang C untuk __int32 adalah –2147483648 hingga 2147483647. Lihat di sini untuk rentang lengkap.

unsigned short 0 to 65535
signed short 32768 to 32767
unsigned long 0 to 4294967295
signed long 2147483648 to 2147483647

Tidak ada jaminan bahwa 'int' akan menjadi 32 bit, jika Anda ingin menggunakan variabel dengan ukuran tertentu, terutama ketika menulis kode yang melibatkan manipulasi bit, Anda harus menggunakan 'Tipe Integer Standar'.

Di jawa

Tipe data int adalah integer komplemen dua 32-bit yang ditandatangani. Ini memiliki nilai minimum -2147.483.648 dan nilai maksimum 2.147.483.647 (inklusif).

Achintya Jha
sumber
2
Nilai yang Anda kutip untuk C hanya rentang minimum.
Oliver Charlesworth
@OliCharlesworth Range jika dari minimum ke maksimum.
Achintya Jha
6
Yang saya maksud adalah, rentang untuk setiap jenis diizinkan lebih besar dari yang Anda kutip di atas.
Oliver Charlesworth
3
Tidak ada dalam C yang disebut __int32. Microsoft tidak memiliki penyesuai C yang ketat, jadi siapa yang peduli tentang cara kerja kompiler non-C mereka? Satu-satunya sumber yang relevan adalah ISO9899, ​​baik 5.2.4.2.1 "Ukuran tipe integer" atau 7.20.2.1 "Batas tipe integer lebar tepat". Tidak ada yang kompatibel dengan Microsoft goo.
Lundin
2
C99 menambahkan int32_t, int16_t, dll, ke standar. Tidak 100% kompatibel dengan penambahan Microsoft, tetapi mereka bekerja dengan cara yang serupa.
Tanyakan Tentang Monica
-1

dalam standar C, Anda dapat menggunakan INT_MAX sebagai nilai 'int' maksimum, konstanta ini harus didefinisikan dalam "limit.h". Konstanta serupa didefinisikan untuk tipe lain ( http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.5.html ), seperti yang dinyatakan, konstanta ini bergantung pada implementasi tetapi memiliki nilai minimum sesuai dengan bit minimum untuk setiap jenis, sebagaimana ditentukan dalam standar.

Carlos UA
sumber
5
Ini tidak benar-benar cocok untuk menjawab pertanyaan OP. Juga, bagian inti dari sebuah jawaban benar-benar tidak boleh dikubur di situs lain.
Brad Koch