Pertanyaan Jika mesin 32-bit hanya dapat menangani angka hingga 2 ^ 32, mengapa saya bisa menulis 1000000000000 (triliun) tanpa mesin saya mogok?


Komputer 32-bit hanya dapat menyimpan bilangan bulat yang ditandatangani hingga 231 - 1.
Inilah mengapa kami kehabisan alamat IPv4 dan telah memasuki era 64-bit.

Namun, angka 231 - 1 (2,147,483,647) tidak sebesar jumlah 1 triliun (1.000.000.000.000) yang sepertinya dapat ditampilkan dengan baik tanpa mesin saya jatuh.

Bisakah seseorang menjelaskan mengapa ini?


365


asal


Pertanyaannya salah. Mesin 32-bit dapat menangani angka yang jauh lebih besar dari 2 ^ 32. Mereka melakukannya sepanjang waktu, dengan 'panjang' dan seterusnya. Mereka hanya dapat menyimpan hingga 2 ^ 32 dalam satu register, tetapi perangkat lunak ditulis untuk memotong masalah ini. Beberapa bahasa modern bahkan tidak memiliki masalah dengan panjang angka yang diberikan. - JFA
Tolong berikan komentar pada topik, sopan, dan relevan dengan aspek teknis dari pertanyaan. Hampir 50 komentar lelucon sudah harus dihapus, dan kami ingin menghindari mengunci pos. Terima kasih. - nhinkle♦
Pertanyaan ini telah ditulis dengan cara yang agak ceroboh. Apa yang Anda maksud dengan "tulis" dan "tampilkan" angka 1000000000000? Ketika Anda menulis pertanyaan Anda menulis nomor 1000000000000, dan browser web Anda menampilkannya dengan baik, saya berasumsi, tetapi ini seharusnya tidak ada yang aneh bagi siapa pun yang pernah menggunakan komputer sebelumnya. Pertanyaannya meminta interpretasi bebas. - HelloGoodbye
Kesadaran manusia diperkirakan memiliki sekitar 50 bit (saya membaca di suatu tempat). Jadi pertanyaannya bukan "Bagaimana saya bisa menulis 10^9 tanpa PC saya menabrak? "melainkan" Bagaimana saya bisa menulis 10^(18) tanpa otak saya menabrak? " - Hagen von Eitzen
Komputer 32 bit hanya dapat menyimpan bilangan bulat UNSIGNED hingga 2 ^ 32 - 1. 2 ^ 32 - 1 bahkan tidak sama dengan 2.147.483.647 ... 300 suara atas dan tidak ada yang menyadari ini? - Koray Tugay


Jawaban:


Saya menjawab pertanyaan Anda dengan menanyakan pertanyaan yang berbeda:

Bagaimana Anda menghitung jari-jari Anda sampai 6?

Anda mungkin menghitung hingga jumlah terbesar yang mungkin dengan satu tangan, dan kemudian Anda pindah ke tangan kedua Anda ketika Anda kehabisan jari. Komputer melakukan hal yang sama, jika mereka perlu untuk mewakili nilai yang lebih besar dari register tunggal dapat menahan mereka akan menggunakan beberapa blok 32bit untuk bekerja dengan data.


785



Lucu, @codename. Lalu, bagaimana Anda menghitung jari-jari Anda hingga 32 atau lebih (mis., Sekali 2 ^ 5 habis)? ;) Analogi bergerak ke sisi lain adalah baik ... bahkan jika biner menunda kebutuhan untuk pindah ke sisi lain. Apa yang ingin saya lihat menghitung hingga 1.024 atau lebih dengan ketrampilan pedal untuk berpindah ke jari-jari kaki seseorang untuk perhitungan lebih lanjut dalam biner - hingga 1.048.575! :) Itu berpotensi 20-bit kekuatan sonboard. : P - J0e3gan
Tolong berikan komentar pada topik dan relevan untuk mendiskusikan aspek teknis dari jawaban ini.Lebih dari 60 komentar lelucon telah dihapus dari jawaban ini, dan kami ingin menghindari mengunci pos. - nhinkle♦
@ codename- mudah, Anda menetapkan satu jari sebagai penunjuk tumpukan. Setelah Anda kehabisan jari Anda menambahkan jumlah ke tumpukan dan mulai menghitung kembali. - Makach
Di mana Anda belajar itu, @codename? Saya mendengar ini pertama dari Frederik Pohl, lihat misalnya sini hjkeen.net/halqn/f_pohl3.htm - Zane
Saya pikir ini bukan jawaban untuk pertanyaan yang relevan. Jawaban oleh @ Bigbio2002 adalah yang benar. Di sini "1000000000000" bukan angka tetapi teks, seperti "adsfjhekgnoregrebgoregnkevnregj". Apa yang Anda katakan itu benar, tetapi saya merasa ini bukan jawaban yang benar. Dan untuk melihat begitu banyak upvote ... - Master Chief


Anda benar bahwa bilangan bulat 32-bit tidak dapat menyimpan nilai lebih besar dari 2 ^ 32-1. Namun, nilai bilangan bulat 32-bit ini dan bagaimana tampilannya di layar Anda adalah dua hal yang sangat berbeda. String tercetak "1000000000000" tidak ditunjukkan oleh bilangan bulat 32-bit dalam memori.

Untuk secara harfiah menampilkan angka "1000000000000" membutuhkan 13 byte memori. Setiap byte individu dapat menyimpan nilai hingga 255. Tidak satupun dari mereka dapat memegang keseluruhan, nilai numerik, tetapi ditafsirkan secara individual sebagai karakter ASCII (misalnya, karakter '0'Diwakili oleh nilai desimal 48, nilai biner 00110000), mereka dapat dirangkai menjadi format yang masuk akal bagi Anda, seorang manusia.


Konsep yang terkait dalam pemrograman adalah typecasting, yang bagaimana komputer akan menafsirkan aliran tertentu 0s dan 1s. Seperti pada contoh di atas, itu dapat ditafsirkan sebagai nilai numerik, karakter, atau bahkan sesuatu yang lain sama sekali. Sementara integer 32-bit mungkin tidak dapat menyimpan nilai 1000000000000, angka floating-point 32-bit akan dapat, menggunakan interpretasi yang sama sekali berbeda.

Adapun bagaimana komputer dapat bekerja dengan dan memproses sejumlah besar secara internal, terdapat bilangan bulat 64-bit (yang dapat mengakomodasi nilai hingga 16 miliar-miliar), nilai-nilai floating-point, serta pustaka khusus yang dapat bekerja dengan besar sewenang-wenang. angka.


397



Sebenarnya itu sebagian besar benar tetapi tidak cukup. Angka floating point 32 poin tidak mungkin dapat secara akurat mewakili 1000000000000. Ini akan mewakili angka yang sangat dekat dengan angka yang diinginkan tetapi tidak persis. - Tim B
@TimB: Pernahkah Anda mendengar tentang format desimal32? Ini bagian dari standar IEEE 754-2008. Format ini mampu merepresentasikan representasi angka ini dengan tepat :) - V-X
Benar, itu bisa. Namun itu bukan format yang orang maksud ketika mereka mengatakan "float", yang biasanya mengacu pada angka floating point 32bit sebagai disimpan dan digunakan oleh prosesor titik mengambang standar di komputer saat ini. - Tim B
@TimB memang. Nomor terdekat dengan apa yang dapat direpresentasikan sebagai float32 adalah 999999995904 - greggo
@TimB: Tapi angka floating-point 64-bit dapat dengan mudah mewakili 1000000000000 persis. Ini 10 ^ 12, atau 2 ^ 12 * 5 ^ 12; 5 ^ 12 membutuhkan 28 bit mantissa. - Keith Thompson


Pertama dan terutama, komputer 32-bit dapat menyimpan angka hingga 2³²-1 dalam satu kata mesin. Kata mesin adalah jumlah data yang dapat diproses CPU dengan cara alami (mis. operasi pada data sebesar itu diterapkan dalam perangkat keras dan umumnya tercepat untuk dilakukan). CPU 32-bit menggunakan kata-kata yang terdiri dari 32 bit, sehingga mereka dapat menyimpan angka dari 0 hingga 2³²-1 dalam satu kata.

Kedua, 1 triliun dan 1000000000000 adalah dua hal yang berbeda.

  • 1 triliun adalah konsep angka abstrak
  • 1000000000000 adalah teks

Dengan menekan 1 sekali dan kemudian 0 12 kali Anda mengetik teks. 1 masukan 1, 0 masukan 0. Lihat? Anda sedang mengetik karakter. Karakter bukan angka. Mesin ketik tidak memiliki CPU atau memori sama sekali dan mereka menangani "angka" semacam itu dengan cukup baik, karena itu hanya teks.

Buktikan itu 1000000000000 bukan angka, tetapi teks: itu bisa berarti 1 triliun (dalam desimal), 4096 (dalam biner) atau 281474976710656 (dalam heksadesimal). Ini memiliki makna lebih banyak dalam sistem yang berbeda. Arti dari 1000000000000 adalah angka dan menyimpannya adalah cerita yang berbeda (kita akan segera kembali).

Untuk menyimpan teks (dalam pemrograman itu disebut tali) 1000000000000 Anda membutuhkan 14 byte (satu untuk setiap karakter ditambah NULL byte yang mengakhiri yang pada dasarnya berarti "string berakhir di sini"). Itu 4 kata mesin. 3 setengah akan cukup, tetapi seperti yang saya katakan, operasi pada kata-kata mesin adalah yang tercepat. Mari berasumsi ASCII digunakan untuk penyimpanan teks, sehingga dalam memori akan terlihat seperti ini: (mengubah kode ASCII yang sesuai 0 dan 1 ke biner, setiap kata dalam baris terpisah)

00110001 00110000 00110000 00110000
00110000 00110000 00110000 00110000
00110000 00110000 00110000 00110000
00110000 00000000 00000000 00000000

Empat karakter cocok dalam satu kata, sisanya dipindahkan ke satu kata berikutnya. Sisanya dipindahkan ke kata berikutnya sampai semuanya (termasuk byte NULL pertama) cocok.

Sekarang, kembali ke nomor penyimpanan. Ia bekerja seperti dengan teks yang meluap, tetapi mereka dipasang dari kanan ke kiri. Mungkin terdengar rumit, jadi inilah contohnya. Demi kesederhanaan mari kita asumsikan bahwa:

  • komputer imajiner kami menggunakan desimal, bukan biner
  • satu byte dapat menyimpan angka 0..9
  • satu kata terdiri dari dua byte

Inilah memori 2 kata yang kosong:

0 0
0 0

Mari simpan nomor 4:

0 4
0 0

Sekarang mari tambahkan 9:

1 3
0 0

Perhatikan bahwa kedua operan akan muat dalam satu byte, tetapi bukan hasilnya. Tetapi kami memiliki satu lagi yang siap digunakan. Sekarang mari kita simpan 99:

9 9
0 0

Sekali lagi, kami telah menggunakan byte kedua untuk menyimpan nomor tersebut. Mari tambahkan 1:

0 0
0 0

Ups ... Itu namanya overflow bilangan bulat dan merupakan penyebab banyak masalah serius, kadang-kadang yang sangat mahal.

Tetapi jika kami berharap bahwa limpahan akan terjadi, kami dapat melakukan ini:

0 0
9 9

Dan sekarang tambahkan 1:

0 1
0 0

Menjadi lebih jelas jika Anda menghapus ruang dan jalur baru byte-perpisahan:

0099    | +1
0100

Kami memperkirakan bahwa luapan dapat terjadi dan kami mungkin membutuhkan memori tambahan. Menangani nomor dengan cara ini tidak secepat dengan angka yang sesuai dengan kata tunggal dan itu harus diimplementasikan dalam perangkat lunak. Menambahkan dukungan untuk dua-32-bit-kata-angka ke 32-bit CPU secara efektif menjadikannya sebuah CPU 64-bit (sekarang dapat beroperasi pada nomor 64-bit aslinya, kan?).

Semua yang saya jelaskan di atas berlaku untuk memori biner dengan 8-bit byte dan kata-kata 4-byte juga, cara kerjanya hampir sama dengan cara:

00000000 00000000 00000000 00000000 11111111 11111111 11111111 11111111    | +1
00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000000

Mengubah angka-angka tersebut menjadi sistem desimal memang sulit. (tetapi bekerja dengan baik dengan heksadesimal)


189



Jawaban Anda terbaca agak merendahkan. OP jelas berbicara tentang nomor, bukan teks: large as the number 1 trillion (1000000000000). Juga, Anda hampir berbicara tentang Aritmatika presisi sewenang-wenang, tetapi Anda tidak pernah benar-benar menyebutkan salah satu istilah untuk apa yang Anda katakan .... - MirroredFate
"1 triliun" juga merupakan string - Elzo Valugi
@ElzoValugi Ini. Saya harus menemukan cara untuk menyajikan konsep nomor abstrak, sebagai lawan dari string yang mewakili angka. Saya percaya "1 triliun" adalah cara yang lebih baik dan kurang ambigu untuk melakukannya (lihat buktinya sebagai jawaban). - gronostaj
@MirroredFate Saya tidak setuju dengan 'jelas berbicara tentang nomor'. OP mengatakan 'ditampilkan dengan baik', yang jelas aku s berbicara tentang teks '1000000000000' kepada saya ... - Joe
@yannbane 'A' adalah karakter dan bukan angka. '?' adalah karakter dan bukan angka. '1' adalah karakter dan bukan angka juga. Karakter hanyalah simbol. Mereka bisa mewakili angka atau angka, tetapi jelas mereka bukan angka. '1' dapat berdiri untuk satu, sepuluh, seratus, seribu, dan seterusnya, itu hanya simbol yang mewakili digit yang dapat berupa angka atau bagiannya. '10' (string karakter) dapat berarti dua atau delapan atau sepuluh atau enam belas dll, tetapi ketika Anda mengatakan Anda memiliki sepuluh buah apel, Anda menggunakan angka sepuluh dan semua orang tahu apa yang Anda maksud. Ada perbedaan besar antara karakter dan angka. - gronostaj


Anda juga bisa menulis "PERNYATAAN INI SALAH" tanpa komputer Anda menabrak :) @ Jawaban Scott adalah tempat untuk kerangka perhitungan tertentu, tetapi pertanyaan Anda tentang "menulis" sejumlah besar menyiratkan bahwa itu hanya teks biasa, setidaknya sampai itu ditafsirkan.

Edit: sekarang dengan sedikit sarkasme informasi yang lebih berguna tentang cara-cara yang berbeda a jumlah dapat disimpan dalam memori. Saya akan menjelaskan ini dengan abstraksi yang lebih tinggi yaitu dalam hal programmer modern mungkin menulis kode sebelum diterjemahkan ke kode mesin untuk eksekusi.

Data pada komputer harus dibatasi untuk tertentu mengetik, dan definisi komputer jenis tersebut menggambarkan operasi apa yang dapat dilakukan pada data ini dan bagaimana (mis. membandingkan angka, menggabungkan teks atau XOR a boolean). Anda tidak bisa hanya menambahkan teks ke nomor, seperti Anda tidak dapat mengalikan angka dengan teks sehingga beberapa nilai ini dapat dikonversi antar-jenis.

Mari kita mulai bilangan bulat tak bertanda. Dalam jenis nilai ini, semua bit digunakan untuk menyimpan informasi tentang digit; milikmu adalah contoh dari Bilangan bulat unsigned 32-bit dari mana saja nilainya 0 untuk 2^32-1 dapat disimpan. Dan ya, tergantung pada bahasa atau arsitektur platform yang digunakan, Anda dapat memiliki bilangan bulat 16-bit atau bilangan bulat 256-bit.

Bagaimana jika Anda ingin menjadi negatif? Secara intuitif, menandatangani bilangan bulat adalah nama permainannya. Konvensi adalah untuk mengalokasikan semua nilai dari -2^(n-1) untuk 2^(n-1)-1 - cara ini kita menghindari kebingungan harus berurusan dengan dua cara untuk menulis +0 dan -0. Jadi integer bertanda 32-bit akan memiliki nilai dari -2147483648 untuk 2147483647. Rapi, bukan?

Ok, kami telah membahas bilangan bulat yang merupakan angka tanpa komponen desimal. Mengekspresikan ini lebih sulit: bagian non-bilangan bulat dapat secara masuk akal hanya berada di suatu tempat di antara 0 dan 1, jadi setiap ekstra yang digunakan untuk menggambarkannya akan meningkatkan ketepatannya: 1/2, 1/4, 1/8 ... Masalahnya adalah, Anda tidak dapat secara tepat mengekspresikan desimal sederhana 0.1 sebagai jumlah pecahan yang hanya dapat memiliki kekuatan dua di penyebutnya! Bukankah akan lebih mudah untuk menyimpan bilangan sebagai bilangan bulat, tetapi setuju untuk meletakkan titik radix (desimal) sebagai gantinya? Ini disebut titik pasti angka, tempat kami menyimpan 1234100 tetapi setujui konvensi untuk membacanya sebagai 1234.100 sebagai gantinya.

Jenis yang relatif lebih umum digunakan untuk perhitungan adalah floating point. Cara kerjanya benar-benar rapi, menggunakan satu bit untuk menyimpan nilai tanda, lalu beberapa untuk menyimpan eksponen dan significand. Ada standar yang menentukan alokasi tersebut, tetapi untuk a 32-bit mengambang jumlah maksimum yang dapat Anda simpan adalah luar biasa

(2 - 2^-23) * 2^(2^7 - 1) ≈ 3.4 * 10^38

Namun ini datang dengan biaya presisi. JavaScript yang tersedia di browser menggunakan pelampung 64-bit, dan masih belum bisa memperbaikinya. Cukup salin ini ke bilah alamat dan tekan enter. Peringatan spoiler: hasilnya tidak akan menjadi 0.3.

javascript:alert(0.1+0.2);

Ada lebih banyak tipe alternatif seperti Microsoft .NET 4.5's BigInteger, yang secara teoritis tidak memiliki batas atas atau bawah dan harus dihitung dalam "batch"; tapi mungkin teknologi yang lebih menarik adalah itu memahami matematika, seperti mesin Wolfram Mathematica, yang bisa bekerja dengan nilai-nilai abstrak seperti tak terbatas.


40



Anda bisa melakukannya di ini realitas. Coba lakukan itu di alam semesta Star Trek. Mundur dulu, karena semua percikan api dan asap. - Michael Petrotta
Itu tidak persis cara kerja fixed-point. Ini sebenarnya adalah sistem di mana angka diskalakan dan bias untuk menghasilkan titik desimal. Dalam contoh Anda, skala adalah 1/1000, tetapi ada juga angka-angka titik tetap (terutama dalam grafik komputer) seperti ini: 0 = 0,0, 255 = 1,0 - skala adalah 1/255. - Andon M. Coleman


Kuncinya adalah memahami bagaimana komputer menyandi angka.

Benar, jika komputer bersikeras menyimpan nomor menggunakan representasi biner sederhana dari nomor menggunakan satu kata (4 byte pada sistem 32 bit), maka komputer 32 bit hanya dapat menyimpan angka hingga 2 ^ 32. Tetapi ada banyak cara lain untuk mengkodekan angka tergantung pada apa yang ingin Anda capai dengan mereka.

Salah satu contohnya adalah bagaimana komputer menyimpan angka floating point. Komputer dapat menggunakan banyak cara yang berbeda untuk mengkodekannya. Standar IEEE 754 mendefinisikan aturan untuk nomor encoding yang lebih besar dari 2 ^ 32. Kasarnya, komputer dapat mengimplementasikan ini dengan membagi 32 bit menjadi bagian-bagian berbeda yang mewakili beberapa digit angka dan bit lain yang mewakili ukuran dari nomor (yaitu eksponen, 10 ^ x). Ini memungkinkan yang jauh lebih besar jarak angka dalam ukuran, tetapi kompromi presisi (yang OK untuk banyak tujuan). Tentu saja komputer juga dapat menggunakan lebih dari satu kata untuk pengkodean ini sehingga meningkatkan ketepatan besarnya jumlah yang disandikan. Versi desimal sederhana dari standar IEEE memungkinkan angka dengan sekitar 7 angka desimal presisi dan angka hingga sekitar 10 ^ 96 dalam ukuran besar.

Tetapi ada banyak pilihan lain jika Anda membutuhkan ketelitian ekstra. Tentunya Anda dapat menggunakan lebih banyak kata dalam pengkodean Anda tanpa batas (meskipun dengan penalti kinerja untuk mengkonversi ke dalam dan keluar dari format yang dikodekan). Jika Anda ingin menjelajahi salah satu cara, hal ini dapat dilakukan di sana adalah add-in open-source yang bagus untuk Excel yang menggunakan skema pengkodean yang memungkinkan ratusan digit presisi dalam perhitungan. Add-in disebut Xnumbers dan tersedia sini. Kode ini dalam Visual Basic yang tidak mungkin tercepat tetapi memiliki keuntungan yang mudah dimengerti dan dimodifikasi. Ini adalah cara yang bagus untuk mempelajari bagaimana komputer mencapai penyandian angka yang lebih panjang. Dan Anda dapat bermain-main dengan hasil di Excel tanpa harus menginstal alat pemrograman apa pun.


31





Itu semua ada dalam pertanyaan Anda.

Kamu bisa menulis nomor apa pun yang Anda suka di atas kertas. Cobalah menulis satu triliun titik pada selembar kertas putih. Ini lambat dan tidak efektif. Itu sebabnya kami memiliki sistem 10-digit untuk mewakili angka-angka besar tersebut. Kami bahkan memiliki nama untuk nomor besar seperti "juta", "triliun", dan banyak lagi, jadi Anda tidak mengatakannya one one one one one one one one one one one... dengan keras.

Prosesor 32-bit dirancang untuk bekerja paling cepat dan efisien dengan blok-blok memori yang tepat 32 digit biner. Tapi kami, orang-orang, biasanya menggunakan sistem angka 10-digit, dan komputer, menjadi elektronik, menggunakan sistem 2-digit (biner). Bilangan 32 dan 64 hanya kebetulan menjadi kekuatan 2. Jadi sejuta dan satu triliun adalah kekuatan 10. Lebih mudah bagi kita untuk beroperasi dengan angka-angka ini daripada orang banyak dari 65536, misalnya.

Kami memecahkan angka-angka besar menjadi angka ketika kita menulisnya di atas kertas. Komputer memecah angka menjadi lebih banyak digit. Kita dapat menuliskan nomor apa pun yang kita suka, dan begitu juga komputer jika kita mendesainnya.


24





32bit dan 64bit merujuk ke alamat memori. Memori komputer Anda seperti kotak kantor pos, masing-masing memiliki alamat yang berbeda. CPU (Central Processing Unit) menggunakan alamat tersebut untuk mengatasi lokasi memori pada RAM Anda (Random Access Memory). Ketika CPU hanya bisa menangani alamat 16bit, Anda hanya bisa menggunakan 32mb RAM (yang tampaknya besar pada saat itu). Dengan 32bit itu pergi ke 4 + gb (yang tampak besar pada saat itu). Sekarang kita memiliki alamat 64bit RAM masuk ke dalam terabyte (yang tampaknya besar).
Namun program ini dapat mengalokasikan beberapa blok memori untuk hal-hal seperti menyimpan angka dan teks, yang terserah program dan tidak terkait dengan ukuran setiap alamat. Jadi sebuah program dapat memberitahu CPU, saya akan menggunakan 10 blok alamat penyimpanan dan kemudian menyimpan nomor yang sangat besar, atau string 10 huruf atau apa pun.
Catatan samping: Alamat memori ditunjukkan oleh "pointer", sehingga nilai 32 dan 64-bit berarti ukuran pointer yang digunakan untuk mengakses memori.



15



Jawaban bagus kecuali untuk rincian - 16bits ruang alamat memberi Anda 64kb, bukan 32mb, dan mesin seperti 286 memiliki alamat 24-bit (untuk 16mb). Juga, dengan alamat 64-bit, Anda melampaui terabyte - lebih seperti 16 exabytes - terabyte adalah sekitar jenis batas motherboard / CPU generasi sekarang memaksakan - bukan ukuran alamat. - Phil
32-bit mengacu pada ukuran kata mesin, bukan alamat memori. Seperti yang disebutkan Phil, 286 adalah CPU 16-bit tetapi menggunakan 24 bit untuk menangani melalui segmentasi memori. CPU x86 adalah 32-bit, tetapi menggunakan pengalamatan 36-bit. Lihat PAE. - gronostaj
@gronostaj well x86 memiliki pengalamatan 32-bit dari 386 ke Pentium. - Ruslan
Upvote karena ini adalah satu-satunya jawaban yang BENAR di sini - 32bit mengacu pada pengalamatan memori 32-bit, bukan aritmatika 32bit. - user1207217
@ user1207217: ?? Jadi menurut alasan Anda misalnya Z80 atau 8080 adalah prosesor 16-bit (karena pengalamatan memori 16-bit dan bus memori)? - pabouk


Karena menampilkan nomor dilakukan menggunakan karakter individu, bukan bilangan bulat. Setiap digit dalam angka diwakili dengan literal karakter terpisah, yang nilai integernya ditentukan oleh pengkodean yang digunakan, misalnya 'a' diwakili dengan nilai ascii 97, sementara '1' diwakili dengan 49. Periksalah tabel ascii di sini.
Untuk menampilkan 'a' dan '1' sama. Mereka adalah literal karakter, bukan bilangan bulat. Setiap karakter literal diizinkan untuk memiliki nilai maksimum 255 dalam platform 32-bit yang menyimpan nilai dalam 8 bit atau 1 byte size (Itu tergantung pada platform, namun 8 bit adalah ukuran karakter yang paling umum), sehingga mereka dapat dikelompokkan bersama-sama dan dapat ditampilkan. Berapa banyak karakter terpisah yang dapat mereka tampilkan tergantung pada RAM yang Anda miliki. Jika Anda hanya memiliki 1 byte RAM maka Anda dapat menampilkan hanya satu karakter, jika Anda memiliki RAM 1GB, Anda dapat menampilkan dengan baik 1024 * 1024 * 1024 karakter (Terlalu malas untuk melakukan matematika).

Namun batasan ini berlaku untuk perhitungan, namun saya rasa Anda tertarik dengan standar IPv4. Meskipun tidak sepenuhnya berhubungan dengan komputer bit-size, entah bagaimana mempengaruhi standar. Ketika standar IPv4 dibuat, mereka menyimpan nilai ip dalam bilangan bulat 32-bit. Sekarang setelah Anda memberi ukuran, dan itu menjadi standar. Segala yang kami ketahui tentang internet bergantung pada itu, dan kemudian kami kehabisan alamat IP untuk ditetapkan. Jadi jika standar IP direvisi menjadi 64 bit, semuanya akan berhenti bekerja, termasuk router Anda (saya menganggap ini benar) dan perangkat jaringan lainnya. Jadi standar baru harus dibuat, yang hanya bertukar integer 32 bit dengan 128 bit satu. Dan sisanya disesuaikan dengan standar. Produsen perangkat keras hanya perlu menyatakan bahwa mereka mendukung standar baru ini dan itu akan menjadi viral. Meskipun tidak sesederhana itu, tapi saya kira Anda mengerti maksudnya di sini.

Penolakan: Sebagian besar poin yang disebutkan di sini adalah benar untuk asumsi saya. Saya mungkin telah kehilangan poin penting di sini untuk membuatnya lebih sederhana. Saya tidak pandai dengan angka, jadi pasti melewatkan beberapa digit, tetapi poin saya di sini adalah menjawab jawaban OP tentang mengapa itu tidak membuat PC crash.


13



Saya belum menurunkan suara, tetapi ada sejumlah masalah dengan jawaban Anda. 1 adalah 0x31 dalam ASCII, bukan 0x1. 1 GB = 1024 ^ 3 B. IPv4 gumpalan ditemukan sebelum 32-bit CPU diperkenalkan, sehingga mengatakan bahwa alamat disimpan dalam bilangan bulat 32-bit bertentangan dengan pertanyaan OP. Dan akhirnya IPv6 menggunakan alamat 128-bit, bukan 64-bit. - gronostaj


Dalam prosesor, ada "kata-kata". Ada kata-kata yang berbeda. Ketika orang mengatakan "prosesor 32 bit", itu berarti sebagian besar "lebar bus memori". Kata ini terdiri dari "bidang" berbeda, yang merujuk pada subsistem komputer yang berhubungan dengan transmisi (24 bit) dan kontrol (bit lainnya). Saya bisa salah tentang angka pasti, pastikan Anda melakukannya melalui manual.

Aspek yang benar-benar berbeda adalah komputasi. Set instruksi SSE dan MMX dapat menyimpan bilangan bulat panjang. Panjang maksimal tanpa kehilangan produktivitas tergantung pada versi SSE saat ini tetapi selalu tentang kelipatan 64 bit.

Prosesor Opteron saat ini dapat menangani bilangan lebar 256 bit (saya tidak yakin tentang bilangan bulat, tetapi pelampung pasti).

Ringkasan: (1) lebar bus tidak terhubung ke lebar perhitungan secara langsung, (2) bahkan kata-kata yang berbeda (kata memori, kata register, kata bus dll) tidak terhubung satu sama lain, lainnya kemudian mereka memiliki pembagi umum sekitar 8 atau 16 atau 24 Banyak prosesor bahkan menggunakan kata 6 bit (tetapi sejarahnya).


12



Tidak benar, prosesor Pentium asli memiliki bus data 64-bit untuk bandwidth memori tinggi, meskipun itu adalah prosesor 32-bit. 8088 adalah prosesor 16-bit dengan bus data 8-bit. - doug65536


Tujuan dari perangkat komputasi, umumnya, adalah menerima, memproses, menyimpan, dan memancarkan data. Perangkat keras yang mendasari hanyalah mesin yang membantu melakukan keempat fungsi tersebut. Ia tidak dapat melakukan apa pun tanpa perangkat lunak.

Perangkat lunak adalah kode yang memberi tahu mesin cara menerima data, cara memprosesnya, cara menyimpannya, dan cara memberikannya kepada orang lain.

Perangkat keras yang mendasari akan selalu memiliki keterbatasan. Dalam kasus mesin 32 bit, sebagian besar register yang memproses data hanya 32 bit lebar. Ini tidak berarti bahwa mesin tidak dapat menangani angka di atas 2 ^ 32, itu berarti bahwa jika Anda ingin menangani angka yang lebih besar, mungkin diperlukan lebih dari satu siklus untuk menerimanya, memprosesnya, menyimpan atau memancarkannya.

Perangkat lunak ini memberi tahu mesin cara menangani angka. Jika perangkat lunak dirancang untuk menangani sejumlah besar, ia mengirimkan serangkaian instruksi ke CPU yang memberitahukannya bagaimana menangani angka yang lebih besar. Misalnya, nomor Anda dapat diwakili oleh dua register 32 bit. Jika Anda ingin menambahkan 1.234 ke nomor Anda, perangkat lunak akan memberitahu CPU untuk terlebih dahulu menambahkan 1.234 ke register yang lebih rendah, kemudian periksa bit overflow untuk melihat apakah penambahan itu menghasilkan angka yang terlalu besar untuk register yang lebih rendah. Jika itu terjadi, maka itu menambah 1 ke register atas.

Dengan cara yang sama anak sekolah dasar diajarkan untuk menambahkan dengan membawa, CPU dapat diberitahu untuk menangani angka yang lebih besar daripada yang dapat disimpan dalam satu daftar. Ini berlaku untuk sebagian besar operasi matematika generik, untuk sejumlah ukuran praktis.


10





Perbedaannya terletak pada cara kami menyimpan data di komputer.

Anda benar bahwa untuk mesin 8-bit teoritis, kami hanya mampu menyimpan 2 ^ 8 nilai dalam register prosesor tunggal atau alamat memori. (Harap diingat ini bervariasi dari "mesin" ke "mesin" berdasarkan pada prosesor yang digunakan, arsitektur memori, dll. Tetapi untuk sekarang, mari tetap menggunakan mesin 'stereotip' hipotetis.)

Untuk mesin 16-bit teoritis, nilai maksimum dalam lokasi register / memori adalah 2 ^ 16, untuk mesin 32-bit, 2 ^ 32, dll.

Selama bertahun-tahun, para programmer telah merancang segala macam penipuan untuk menyimpan dan menangani angka yang lebih besar daripada yang dapat disimpan dalam register prosesor tunggal atau alamat memori. Banyak metode yang ada, tetapi semuanya melibatkan penggunaan lebih dari satu register / alamat memori untuk menyimpan nilai yang lebih besar dari lebar lokasi register / memori "asli" mereka.

Semua metode ini bermanfaat karena mesin dapat menyimpan / memproses nilai yang lebih besar dari kapasitas asli mereka. Kelemahannya adalah hampir semua pendekatan memerlukan banyak instruksi mesin / bacaan / etc. untuk menangani angka-angka ini. Untuk sesekali jumlah besar, ini bukan masalah. Saat berurusan dengan banyak dalam jumlah besar (terutama alamat memori) overhead yang terlibat memperlambat segalanya.

Oleh karena itu keinginan umum untuk membuat register, lokasi memori dan perangkat keras alamat memori "lebih luas" dan lebih luas untuk menangani angka besar "secara native" sehingga nomor tersebut dapat ditangani dengan jumlah operasi minimum.

Karena ukuran nomor tidak terbatas, register prosesor / ukuran / pengalamatan memori selalu merupakan keseimbangan ukuran angka asli dan biaya yang terlibat dalam penerapan lebar yang lebih besar dan lebih besar.


10