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

369

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

Namun, angka 2 31 - 1 (2.147.483.647) tidak sebesar angka 1 triliun (1.000.000.000.000) yang tampaknya dapat saya tampilkan dengan baik tanpa mesin saya mogok.

Adakah yang bisa menjelaskan mengapa ini?

Ben Johnson mk2
sumber
35
Pertanyaannya cacat. 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 ini ditulis untuk mem-bypass masalah ini. Beberapa bahasa modern bahkan tidak memiliki masalah dengan panjang angka yang diberikan.
JFA
23
Harap simpan komentar sesuai topik, sopan, dan relevan dengan aspek teknis pertanyaan. Hampir 50 komentar lelucon sudah harus dihapus, dan kami ingin menghindari mengunci pos. Terima kasih.
nhinkle
6
Pertanyaan ini telah ditulis dengan cara yang agak ceroboh. Apa yang Anda maksud dengan "tulis" dan "tampilkan" nomor 1000000000000? Ketika Anda menulis pertanyaan, Anda menulis angka 1000000000000, dan peramban web Anda menampilkannya dengan baik, saya kira, tetapi ini seharusnya tidak aneh bagi siapa pun yang pernah menggunakan komputer sebelumnya. Pertanyaannya meminta interpretasi gratis.
HelloGoodbye
7
Kesadaran manusia diperkirakan memiliki sekitar 50 bit (saya membaca di suatu tempat). Jadi pertanyaannya bukan "Bagaimana saya bisa menulis 10^9tanpa crash PC saya?" melainkan "Bagaimana saya bisa menulis 10^(18)tanpa otak saya hancur?"
Hagen von Eitzen
1
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 dan tidak ada yang menyadari hal ini?
Koray Tugay

Jawaban:

784

Saya menjawab pertanyaan Anda dengan menanyakan yang berbeda:

Bagaimana Anda menghitung sampai 6 jari?

Anda mungkin menghitung hingga jumlah terbesar yang mungkin dengan satu tangan, dan kemudian Anda beralih ke tangan kedua Anda ketika Anda kehabisan jari. Komputer melakukan hal yang sama, jika mereka perlu merepresentasikan nilai yang lebih besar daripada yang bisa dipegang oleh satu register, mereka akan menggunakan beberapa blok 32bit untuk bekerja dengan data.

Scott Chamberlain
sumber
16
Lucu, @codename. Lalu bagaimana Anda menghitung jari-jari Anda hingga 32 atau lebih (yaitu sekali 2 ^ 5 habis)? ;) Analogi dari pindah ke tangan lain adalah baik ... bahkan jika biner menunda kebutuhan untuk pindah ke tangan yang lain. Apa yang ingin saya lihat adalah menghitung ke 1.024 atau lebih dengan ketangkasan pedial untuk pindah ke jari kaki seseorang untuk menghitung lebih lanjut dalam biner - hingga 1.048.575! :) Itu berpotensi 20-bit daya papan induk. : P
J0e3gan
14
Harap simpan komentar sesuai topik dan relevan untuk membahas 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 kehabisan jari, Anda menambahkan jumlahnya ke tumpukan dan memulai kembali penghitungan.
Makach
Di mana Anda belajar itu, @codename? Saya mendengar ini pertama kali dari Frederik Pohl, lihat misalnya di sini hjkeen.net/halqn/f_pohl3.htm
Zane
2
Saya pikir ini bukan jawaban untuk pertanyaan yang relevan. Jawaban oleh @ Bigbio2002 adalah yang benar. Di sini "1000000000000" bukan angka melainkan teks, seperti "adsfjhekgnoregrebgoregnkevnregj". Apa yang Anda katakan itu benar, tetapi saya sangat merasa ini bukan jawaban yang benar. Dan untuk melihat begitu banyak upvotes ...
Ketua Master
398

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

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


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

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

Bigbio2002
sumber
22
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 sangat dekat dengan angka yang diinginkan tetapi tidak persis seperti itu.
Tim B
6
@TimB: Pernahkah Anda mendengar tentang format desimal32? Itu bagian dari standar IEEE 754-2008. Format ini mampu merepresentasikan angka ini dengan benar :)
VX
15
Benar, itu bisa. Namun itu bukan format yang orang maksud ketika mereka mengatakan "float", yang biasanya mengacu pada angka floating point 32 bit yang disimpan dan digunakan oleh prosesor floating point standar di komputer saat ini.
Tim B
2
@TimB memang. Nomor terdekat dengan yang dapat direpresentasikan sebagai float32 adalah 999999995904
greggo
4
@ TIMB: Tapi angka floating-point 64-bit dapat dengan mudah mewakili dengan 1000000000000tepat. Ini 10 ^ 12, atau 2 ^ 12 * 5 ^ 12; 5 ^ 12 membutuhkan 28 bit mantissa.
Keith Thompson
191

Pertama dan terpenting, 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 diimplementasikan dalam perangkat keras dan umumnya paling cepat 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 1sekali dan kemudian 012 kali Anda mengetik teks. 1input 1, 0input 0. Lihat? Anda sedang mengetik karakter. Karakter bukan angka. Mesin tik tidak memiliki CPU atau memori sama sekali dan mereka menangani "angka" dengan cukup baik, karena itu hanya teks.

Bukti bahwa 100000000000000 bukan angka, tetapi teks: ini dapat berarti 1 triliun (dalam desimal), 4096 (dalam biner) atau 281474976710656 (dalam heksadesimal). Ini bahkan memiliki lebih banyak makna dalam sistem yang berbeda. Arti 1000000000000 adalah angka dan menyimpannya adalah cerita yang berbeda (kami akan segera kembali ke sana).

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

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

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

Sekarang, kembali ke menyimpan nomor. Ini berfungsi seperti halnya dengan teks meluap, tetapi mereka pas dari kanan ke kiri. Mungkin terdengar rumit, jadi inilah contohnya. Demi kesederhanaan, mari kita asumsikan bahwa:

  • komputer imajiner kita menggunakan desimal bukan biner
  • satu byte bisa menampung angka 0..9
  • satu kata terdiri dari dua byte

Berikut ini adalah memori 2 kata yang kosong:

0 0
0 0

Mari kita simpan nomor 4:

0 4
0 0

Sekarang mari kita tambahkan 9:

1 3
0 0

Perhatikan bahwa kedua operan akan muat dalam satu byte, tetapi bukan hasilnya. Tapi kami punya 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

Whoops ... Itu disebut integer overflow dan merupakan penyebab banyak masalah serius, terkadang sangat mahal .

Tetapi jika kita berharap bahwa luapan akan terjadi, kita dapat melakukan ini:

0 0
9 9

Dan sekarang tambahkan 1:

0 1
0 0

Itu menjadi lebih jelas jika Anda menghapus spasi-byte memisahkan dan baris baru:

0099    | +1
0100

Kami telah memperkirakan bahwa overflow dapat terjadi dan kami mungkin membutuhkan memori tambahan. Menangani angka dengan cara ini tidak secepat dengan angka yang sesuai dengan satu kata dan harus diimplementasikan dalam perangkat lunak. Menambahkan dukungan untuk angka dua-32-bit-kata ke CPU 32-bit secara efektif menjadikannya CPU 64-bit (sekarang dapat beroperasi pada angka 64-bit secara asli, bukan?).

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

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

Mengubah angka-angka tersebut ke sistem desimal sulit, meskipun. (tapi ini bekerja cukup baik dengan heksadesimal )

gronostaj
sumber
21
Jawaban Anda dibaca agak merendahkan. OP jelas berbicara tentang jumlah, tidak teks: large as the number 1 trillion (1000000000000). Juga, Anda hampir berbicara tentang aritmatika presisi-Sewenang-wenang , tetapi Anda tidak pernah benar-benar menyebutkan istilah apa pun yang Anda katakan ....
MirroredFate
12
"1 triliun" juga merupakan string
Elzo Valugi
3
@ ElzoValugi Ini. Saya harus menemukan cara untuk menyajikan konsep angka abstrak, bukan string yang mewakili angka. Saya percaya "1 triliun" adalah cara yang lebih baik dan tidak ambigu untuk melakukannya (lihat buktinya sebagai jawaban).
gronostaj
25
@MirroredFate Saya tidak setuju dengan 'jelas berbicara tentang nomor'. OP mengatakan 'ditampilkan baik', yang jelas adalah berbicara tentang teks '1000000000000' dengan saya ...
Joe
4
@yannbane 'A' adalah karakter dan bukan angka. ' adalah karakter dan bukan angka. '1' adalah karakter dan bukan angka juga. Karakter hanyalah simbol. Mereka dapat mewakili angka atau angka, tetapi jelas mereka bukan angka. '1' dapat berarti satu, sepuluh, seratus, ribu 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 apel, Anda menggunakan nomor sepuluh dan semua orang tahu apa yang Anda maksud. Ada perbedaan besar antara karakter dan angka.
gronostaj
40

Anda juga dapat menulis "PERNYATAAN INI SALAH" tanpa komputer Anda mogok :) @ Scott menjawab tepat untuk kerangka perhitungan tertentu, tetapi pertanyaan Anda tentang "menulis" sejumlah besar menyiratkan bahwa itu hanya teks biasa, setidaknya sampai itu ditafsirkan.

Sunting: sekarang dengan sarkasme yang lebih sedikit, informasi yang lebih berguna tentang berbagai cara nomor dapat disimpan dalam memori. Saya akan menjelaskan ini dengan abstraksi yang lebih tinggi yaitu dalam hal programmer modern dapat menulis kode sebelum diterjemahkan ke kode mesin untuk dieksekusi.

Data pada komputer harus dibatasi untuk jenis tertentu , dan definisi komputer dari jenis tersebut menjelaskan operasi apa yang dapat dilakukan pada data ini dan bagaimana (yaitu membandingkan angka, teks gabungan atau XOR a boolean). Anda tidak bisa begitu saja menambahkan teks ke angka, sama seperti Anda tidak bisa mengalikan angka dengan teks sehingga beberapa dari nilai-nilai ini dapat dikonversi antara jenis.

Mari kita mulai dengan bilangan bulat yang tidak ditandai . Dalam tipe nilai ini, semua bit digunakan untuk menyimpan informasi tentang digit; Anda adalah contoh dari 32-bit unsigned integer di mana setiap nilai dari 0ke 2^32-1dapat disimpan. Dan ya, tergantung pada bahasa atau arsitektur platform yang digunakan Anda bisa memiliki bilangan bulat 16-bit atau bilangan bulat 256-bit.

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

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

Jenis yang relatif lebih umum digunakan untuk perhitungan adalah floating point. Cara kerjanya sangat rapi, ia menggunakan satu bit untuk menyimpan nilai tanda, kemudian beberapa untuk menyimpan eksponen dan signifikan. Ada standar yang mendefinisikan alokasi tersebut, tetapi untuk float 32-bit , jumlah maksimum yang dapat Anda simpan adalah jumlah yang luar biasa

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

Namun ini datang pada biaya presisi. JavaScript yang tersedia di peramban menggunakan pelampung 64-bit, dan itu masih belum dapat memperbaikinya. Cukup salin ini ke bilah alamat dan tekan enter. Peringatan spoiler: hasilnya tidak akan seperti itu 0.3.

javascript:alert(0.1+0.2);

Ada lebih banyak jenis alternatif seperti Microsoft .NET 4.5's BigInteger, yang secara teoritis tidak memiliki batas atas atau bawah dan harus dihitung dalam "kumpulan"; tetapi mungkin teknologi yang lebih menarik adalah mereka yang memahami matematika, seperti mesin Wolfram Mathematica, yang dapat bekerja dengan tepat dengan nilai-nilai abstrak seperti tak terhingga .

ov
sumber
8
Anda dapat melakukannya dalam kenyataan ini . Coba lakukan itu di alam semesta Star Trek. Cukup mundur dulu, karena semua percikan api dan asap.
Michael Petrotta
Itu bukan 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 titik tetap (terutama dalam grafik komputer) seperti ini: 0 = 0,0, 255 = 1,0 - skala adalah 1/255.
Andon M. Coleman
31

Kuncinya adalah memahami bagaimana komputer menyandikan angka.

Benar, jika komputer bersikeras menyimpan angka menggunakan representasi biner sederhana dari angka 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 menyandikan angka tergantung pada apa yang ingin Anda capai bersama mereka.

Salah satu contoh adalah bagaimana komputer menyimpan angka floating point. Komputer dapat menggunakan sejumlah cara berbeda untuk menyandikannya. Standar IEEE 754 mendefinisikan aturan untuk nomor enkode lebih besar dari 2 ^ 32. Secara kasar, komputer dapat mengimplementasikan ini dengan membagi 32 bit menjadi bagian-bagian berbeda yang mewakili beberapa digit angka dan bit lainnya mewakili ukuran angka (yaitu eksponen, 10 ^ x). Ini memungkinkan jangkauan yang jauh lebih besarangka dalam hal ukuran, tetapi kompromi presisi (yang OK untuk banyak tujuan). Tentu saja komputer juga dapat menggunakan lebih dari satu kata untuk pengkodean ini yang meningkatkan presisi dari besarnya angka-angka yang dikodekan. Versi 32 sederhana desimal standar IEEE memungkinkan angka dengan presisi presisi sekitar 7 digit desimal dan besarnya sekitar 10 ^ 96.

Tetapi ada banyak opsi lain jika Anda membutuhkan ketelitian ekstra. Jelas Anda dapat menggunakan lebih banyak kata dalam penyandian Anda tanpa batas (meskipun dengan penalti kinerja untuk mengkonversi masuk dan keluar dari format yang disandikan). Jika Anda ingin menjelajahi satu cara ini bisa dilakukan ada 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 di sini . Kode ini dalam Visual Basic yang bukan yang 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 bisa bermain-main dengan hasil dalam Excel tanpa harus menginstal alat pemrograman apa pun.

matt_black
sumber
24

Semua ada di pertanyaan Anda.

Anda dapat 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 itu. Kami bahkan memiliki nama untuk angka besar seperti "juta", "triliun" dan banyak lagi, jadi Anda tidak mengatakannya dengan one one one one one one one one one one one...lantang.

Prosesor 32-bit dirancang untuk bekerja paling cepat dan efisien dengan blok memori yang panjangnya persis 32 digit biner. Tapi kami, orang-orang, biasanya menggunakan sistem numerik 10 digit, dan komputer, karena elektronik, menggunakan sistem 2 digit ( biner ). Angka 32 dan 64 kebetulan adalah kekuatan 2. Begitu juga satu juta dan satu triliun adalah kekuatan 10. Lebih mudah bagi kita untuk beroperasi dengan angka-angka ini daripada banyak 65536, misalnya.

Kita memecah angka-angka besar menjadi angka ketika kita menuliskannya di atas kertas. Komputer memecah angka menjadi angka yang lebih besar. Kita dapat menuliskan angka apa pun yang kita suka, dan mungkin juga komputer jika kita mendesainnya.

pengguna1306322
sumber
15

32bit dan 64bit merujuk ke alamat memori. Memori komputer Anda seperti kotak pos, masing-masing memiliki alamat yang berbeda. CPU (Central Processing Unit) menggunakan alamat tersebut untuk mengatasi lokasi memori pada RAM Anda (Memori Akses Acak). Ketika CPU hanya bisa menangani alamat 16bit, Anda hanya bisa menggunakan 32mb RAM (yang tampak besar pada saat itu). Dengan 32bit ia pergi ke 4 + gb (yang tampak besar saat itu). Sekarang kita memiliki alamat 64bit, RAM menjadi terabyte (yang tampaknya sangat besar).
Namun program ini dapat mengalokasikan banyak blok memori untuk hal-hal seperti menyimpan angka dan teks, yang tergantung pada program dan tidak terkait dengan ukuran masing-masing alamat. Jadi suatu program dapat memberitahu CPU, saya akan menggunakan 10 blok alamat penyimpanan dan kemudian menyimpan jumlah 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.

Insinyur
sumber
2
Jawaban yang bagus kecuali untuk perinciannya - 16 bit 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 berada di sekitar batasan yang diterapkan oleh motherboard / CPU generasi sekarang - bukan ukuran alamatnya.
Phil
4
32-bit mengacu pada ukuran kata mesin, bukan alamat memori. Seperti yang disebutkan Phil, 286 adalah CPU 16-bit tetapi menggunakan 24 bit untuk mengatasi melalui segmentasi memori. CPU x86 berukuran 32-bit, tetapi gunakan pengalamatan 36-bit. Lihat PAE .
gronostaj
@gronostaj well x86 memiliki pengalamatan 32-bit dari 386 ke Pentium.
Ruslan
Suara positif karena ini adalah satu-satunya jawaban yang BENAR di sini - 32bit mengacu pada pengalamatan memori 32bit, bukan aritmatika 32bit.
user1207217
@ user1207217: ?? Jadi menurut alasan Anda misalnya Z80 atau 8080 adalah prosesor 16-bit (karena pengalamatan 16-bit dan bus memori)?
pabouk
13

Karena menampilkan nomor dilakukan menggunakan karakter individual, bukan bilangan bulat. Setiap digit dalam angka diwakili dengan karakter literal yang terpisah, yang nilai integernya ditentukan oleh pengkodean yang digunakan, misalnya 'a'diwakili dengan nilai ascii 97, sementara '1'diwakili dengan 49. Periksa tabel ascii di sini .
Untuk menampilkan 'a' dan '1' adalah sama. Mereka adalah karakter literal, bukan bilangan bulat. Setiap literal karakter diizinkan untuk memiliki nilai maksimal 255 dalam platform 32-bit yang menyimpan nilai dalam ukuran 8 bit atau 1 byte (Itu tergantung platform, namun 8 bit adalah ukuran karakter yang paling umum), sehingga mereka dapat dikelompokkan bersama dan dapat ditampilkan. Seberapa 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 1GB RAM, Anda dapat menampilkan dengan baik 1024 * 1024 * 1024 karakter (Terlalu malas untuk melakukan matematika).

Namun keterbatasan ini berlaku untuk perhitungan, namun saya rasa Anda tertarik dengan standar IPV4. Meskipun tidak sepenuhnya terkait dengan komputerbit-size, entah bagaimana itu mempengaruhi standar. Ketika standar IPV4 dibuat, mereka menyimpan nilai ip dalam bilangan bulat 32-bit. Sekarang setelah Anda memberi ukuran, dan itu menjadi standar. Semua yang kita ketahui tentang internet bergantung pada hal itu, dan kemudian kita kehabisan alamat IP untuk ditugaskan. Jadi jika standar IP direvisi menjadi 64 bit, semuanya hanya akan berhenti berfungsi, termasuk router Anda (saya anggap ini benar) dan perangkat jaringan lainnya. Jadi standar baru harus dibuat, yang baru saja menukar integer 32 bit dengan 128 bit satu. Dan sisanya disesuaikan 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.

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

cupu
sumber
2
Saya belum memilih, tetapi ada sejumlah masalah dengan jawaban Anda. 1adalah 0x31 di ASCII, bukan 0x1. 1 GB = 1024 ^ 3 B. Gumpalan IPv4 ditemukan sebelum CPU 32-bit 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
13

Dalam prosesor, ada "kata-kata". Ada kata yang berbeda. Ketika orang mengatakan "prosesor 32 bit", kebanyakan berarti "lebar bus memori". Kata ini terdiri dari "bidang" yang berbeda, yang merujuk pada subsistem komputer yang berkaitan dengan transmisi (24 bit) dan kontrol (bit lain). Saya bisa salah tentang angka pastinya, pastikan diri Anda yakin melalui manual.

Aspek yang sama sekali berbeda adalah perhitungan. 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 angka lebar 256 bit (saya tidak yakin tentang integer, tetapi float 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, selain itu mereka memiliki pembagi umum sekitar 8 atau 16 atau 24. Banyak prosesor bahkan menggunakan kata 6 bit (tetapi sejarahnya).

sanaris
sumber
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
10

Tujuan dari perangkat komputasi, umumnya, adalah untuk menerima, memproses, menyimpan, dan mengeluarkan data. Perangkat keras yang mendasarinya hanyalah mesin yang membantu melakukan keempat fungsi tersebut. Itu tidak dapat dilakukan tanpa perangkat lunak.

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

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

Perangkat lunak memberi tahu mesin cara menangani angka. Jika perangkat lunak dirancang untuk menangani angka yang besar, ia akan mengirim serangkaian instruksi ke CPU yang memberi tahu cara 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 menambahkan 1.234 pertama 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 ya, maka itu menambah 1 ke register atas.

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

Adam Davis
sumber
10

Perbedaannya terletak pada bagaimana kita menyimpan data di komputer.

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

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

Selama bertahun-tahun, programmer telah merancang segala macam kesalahan 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 lebih besar dari lebar lokasi register / memori "asli" mereka.

Semua metode ini bermanfaat karena mesin dapat menyimpan / memproses nilai yang lebih besar dari kapasitas aslinya. Kelemahannya adalah hampir semua pendekatan membutuhkan beberapa instruksi mesin / baca / etc. untuk menangani angka-angka ini. Untuk jumlah besar sesekali, ini bukan masalah. Ketika berhadapan dengan banyak nomor besar (khususnya alamat memori besar) 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 sejumlah besar "secara asli" sehingga angka tersebut dapat ditangani dengan jumlah operasi minimum.

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

pengguna48420
sumber
8

Komputer 32 bit hanya dapat menyimpan angka hingga 2 ^ 32 dalam satu kata mesin, tetapi itu tidak berarti bahwa mereka tidak dapat menangani entitas data yang lebih besar.

Arti dari komputer 32 bit umumnya bahwa bus data dan bus alamat adalah 32 bit, yang berarti bahwa komputer dapat menangani 4 GB ruang alamat memori sekaligus, dan mengirim empat byte data sekaligus pada bus data .

Namun itu tidak membatasi komputer untuk menangani lebih banyak data, ia hanya perlu membagi data menjadi empat byte saat dikirim melalui bus data.

Prosesor Intel 32-bit biasa dapat menangani angka 128-bit secara internal, yang memungkinkan Anda menangani angka seperti 10000000000000000000000000000000000000000000000 tanpa masalah.

Anda dapat menangani angka yang jauh lebih besar daripada di komputer, tetapi kemudian perhitungan harus dilakukan oleh perangkat lunak, CPU tidak memiliki instruksi untuk menangani angka yang lebih besar dari 128 bit. (Ini dapat menangani angka yang jauh lebih besar dalam bentuk angka floating point, tetapi kemudian Anda hanya memiliki 15 digit presisi.)

Guffa
sumber
6

Hanya menambahkan catatan ke banyak jawaban lain, karena ini adalah fakta yang cukup penting dalam pertanyaan ini yang terlewatkan.

"32 bit" mengacu pada lebar alamat memori. Ini tidak ada hubungannya dengan ukuran register. Banyak CPU 32 bit kemungkinan memiliki register 64 atau bahkan 128 bit. Khususnya merujuk pada lini produk x86, CPU konsumen baru-baru ini, yang semuanya 64bit, memiliki register hingga 256 bit untuk keperluan khusus.

Perbedaan antara lebar register dan lebar alamat sudah ada sejak zaman kuno, ketika kami memiliki register 4 bit dan alamat 8 bit, atau sebaliknya.

Sangat mudah untuk melihat bahwa menyimpan sejumlah besar tidak masalah terlepas dari ukuran register, seperti yang dijelaskan dalam jawaban lain.

Alasan mengapa register, berapa pun ukurannya, dapat juga menghitung dengan angka yang lebih besar, adalah bahwa perhitungan terlalu besar dapat dipecah menjadi beberapa yang lebih kecil yang cocok dengan register (itu hanya sedikit lebih rumit pada kenyataannya).

mafu
sumber
Itu tidak sepenuhnya benar; 64 bit merujuk tidak konsisten, tetapi sistem dengan lebar register 64 bit sering disebut 64 bit. Wikipedia mengatakan "arsitektur komputer 64-bit umumnya memiliki register integer dan addressing yang lebar 64 bit". Ya, lini produk x86 (atau AMD-64) modern memiliki register tujuan khusus yang sangat besar, tetapi mereka memiliki register utama 64 bit dan dapat mengakses memori 48-52 bit; sistem x86 yang lebih lama memiliki register utama 32 bit dan mengakses 24-36 bit memori, dan 8086 disebut chip 16-bit, memiliki register lebar 16-bit dan mengakses 20 bit memori.
prosfila
@prosfilaes Itu banyak informasi berharga, saya merujuk kepada mereka (saya gagal mengingat detailnya seperti yang Anda lakukan tho). Jangan ragu untuk mengedit ini menjadi jawabannya.
mafu
6

Jawaban yang sudah diberikan sebenarnya cukup bagus, tetapi mereka cenderung mengatasi masalah dari sisi yang berbeda dan dengan demikian menyajikan gambaran yang tidak lengkap. Mereka juga agak terlalu teknis, menurut saya.

Jadi, hanya untuk mengklarifikasi sesuatu yang mengisyaratkan tetapi tidak secara eksplisit dinyatakan dalam jawaban lain, dan yang saya pikir adalah inti dari masalah ini:

Anda mencampurkan beberapa konsep dalam pertanyaan Anda , dan salah satunya ("32 bit") sebenarnya dapat merujuk ke berbagai hal yang berbeda (dan jawaban yang berbeda memiliki interpretasi yang berbeda). Konsep-konsep ini semua ada hubungannya dengan jumlah bit (1 dan 0) yang digunakan (atau tersedia) dalam berbagai konteks komputasi (apa yang saya maksud dengan ini diharapkan akan diklarifikasi dengan contoh-contoh di bawah), tetapi konsep-konsep tersebut sebaliknya tidak terkait .

Secara eksplisit:

  • "IPv4 / 6" mengacu pada protokol internet , seperangkat aturan yang mendefinisikan bagaimana informasi akan dikemas dan ditafsirkan di internet. Perbedaan utama (atau paling tidak paling terkenal) antara IPv4 dan IPv6 adalah bahwa ruang alamat (yaitu set alamat yang dapat digunakan untuk membedakan antara berbagai lokasi di jaringan) lebih besar di IPv6. Ini berkaitan dengan berapa bit dalam setiap paket data yang dikirim melalui jaringan yang dialokasikan untuk (yaitu disisihkan untuk tujuan) mengidentifikasi pengirim paket dan penerima yang dituju.
    • Analogi non-komputasi: Setiap paket seperti surat yang dikirim melalui surat siput, dan ruang alamat seperti jumlah karakter yang Anda "bolehkan" gunakan saat menulis alamat dan mengembalikan alamat pada amplop.
    • Saya tidak melihat ini disebutkan dalam jawaban lain sejauh ini.
  • "Kata-kata" memori-komputer (32-bit dan 64-bit) secara umum dapat dianggap sebagai bagian terkecil dari data yang digunakan komputer, atau "dipikirkan". Bit-bit data ini berkumpul untuk membuat bit-bit data lainnya. , seperti potongan teks atau bilangan bulat yang lebih besar.
  • Pointer 32-bit mungkin atau mungkin bukan kata-kata, tetapi mereka diperlakukan secara atom (yaitu sebagai unit individu yang tidak dapat dipecah menjadi komponen yang lebih kecil). Pointer adalah cara tingkat terendah di mana komputer dapat merekam lokasi dalam memori beberapa potongan data yang sewenang-wenang. Perhatikan bahwa ukuran penunjuk yang digunakan oleh komputer (atau, sebenarnya, oleh sistem operasi) membatasi rentang memori yang dapat diakses oleh penunjuk tunggal, karena hanya ada banyak lokasi memori yang memungkinkan penunjuk dapat "arahkan" ke karena ada nilai yang mungkin untuk pointer itu sendiri. Ini analog dengan cara IPv4 membatasi jangkauan kemungkinan alamat internet, tetapi tidakbatasi jumlah data yang dapat ditampilkan, misalnya, halaman web tertentu. Namun, ukuran pointer tidak membatasi ukuran data itu sendiri yang dapat ditunjukkan oleh pointer. (Sebagai contoh skema untuk memungkinkan ukuran data melebihi kisaran pointer, lihat struktur pointer inode Linux . Perhatikan bahwa ini adalah penggunaan kata "pointer" yang sedikit berbeda dari biasanya, karena pointer biasanya merujuk ke sebuah pointer ke memori akses acak, bukan ruang hard drive.)
    • Analogi non-komputasi: hmmmm .... ini agak rumit. Mungkin sistem desimal Dewey untuk mengindeks bahan pustaka agak mirip? Atau sistem pengindeksan apa pun, sungguh.
    • Lihat jawaban SiteNook .
    • Harap dicatat bahwa penjelasan saya tentang petunjuk di atas menghilangkan beberapa detail halus dan bisa dibilang tidak sepenuhnya benar. Namun, dalam bahasa pemrograman di mana programmer bekerja secara langsung dengan pointer, mode mental yang saya gambar biasanya cukup untuk tujuan praktis.
  • Angka - angka yang "dapat ditampilkan" oleh komputer tidak (untuk tujuan praktis) dibatasi oleh perangkat keras atau sistem operasi komputer; mereka diperlakukan seperti teks lainnya.

Perhatikan bahwa ini tidak dimaksudkan untuk menjadi daftar interpretasi yang komprehensif untuk frasa "32 bit."

Penghargaan ekstra: untuk benar-benar melihat perbedaan filosofis telanjang antara angka dan potongan primitif memori komputer, baca sedikit tentang mesin Turing .

Kyle Strand
sumber
Saya pikir referensi ke IPv4 adalah untuk menunjukkan bahwa jumlah alamat IPv4 secara efektif terbatas pada panjang integer 32-bit yang ditandatangani, sedangkan IPv6 menggunakan 128 bit dan karena itu dapat memiliki banyak pesanan dengan alamat lebih banyak.
Clonkex
@Clonkex Mungkin, meskipun itu jelas bukan pertanyaannya.
Kyle Strand
5

Jika Anda menulis 100000000000000 misalnya dalam kalkulator, komputer akan menghitungnya sebagai nomor jenis Riil dengan titik desimal . Batas 32 bit yang Anda sebutkan menyentuh lebih banyak semua nomor tipe Integer tanpa titik desimal. Jenis data yang berbeda menggunakan metode yang berbeda cara masuk ke bit / byte.

Nomor tipe integer : Tabel ini dapat membantu Anda menangkap intinya ( http://msdn.microsoft.com/en-us/library/296az74e.aspx ). Ini menyentuh batas untuk C ++. Misalnya nomor jenis Int64 memiliki batas dari -9223372036854775808 hingga 9223372036854775807.

Nomor tipe nyata : Nomor tipe nyata berisi nilai dengan floating point dan eksponen dan Anda dapat memasukkan angka yang jauh lebih besar, tetapi dengan akurasi / presisi terbatas. ( http://msdn.microsoft.com/en-us/library/6bs3y5ya.aspx ) Misalnya LDBL (double besar) di C ++ memiliki eksponen maksimum 308, jadi mungkin Anda dapat memasukkan atau memiliki nomor hasil 9.999 x 10^308, artinya Anda akan secara teoritis 308 (+1) digit 9tetapi hanya 15 digit paling penting yang akan digunakan untuk mewakilinya, sisanya akan hilang, karena presisi terbatas.

Selain itu, ada bahasa pemrograman yang berbeda dan mereka bisa memiliki implementasi batas angka yang berbeda. Jadi Anda dapat membayangkan bahwa aplikasi khusus dapat menangani angka yang jauh lebih besar (dan / atau lebih tepat / tepat) daripada C ++.

Dee
sumber
"Jawaban" ini salah: kalkulator menggunakan representasi nomor BCD untuk menghindari kesalahan pemotongan. IE 0,1 desimal tidak dapat secara akurat direpresentasikan sebagai angka biner panjang terbatas.
serbuk gergaji
5

Jika Anda ingin contoh praktis tentang berapa banyak program pada sistem Linux tipikal yang menangani pemrosesan dan output dalam jumlah besar:

libgmp- GNU Multiple Precision Arithmetic Library adalah perpustakaan yang paling banyak digunakan untuk tujuan ini pada sistem Linux. Contoh sederhana mengalikan 2 ^ 80 dengan 1000:

#include <gmp.h>

// Each large integer uses the mpz_t type provided by libgmp
mpz_t a_large_number;
mpz_t base;
mpz_t result;

// Initalize each variable
mpz_init(a_large_number);
mpz_init(base);
mpz_init(result);

// Assign the number 2 to the variable |base|
mpz_set_ui(base, 2);

// Raise base^80 (2^80), store the result in |a_large_number|
mpz_pow_ui(a_large_number, base, 80);

// Multiply |a_large_number| by 1000, store the result in |result|
mpz_mul_ui(result, a_large_number, 1000);

// Finally, output the result in decimal and hex notation
gmp_printf("decimal: %Zd, hex: %ZX\n", result, result);

Jadi pada dasarnya itu sama dengan menggunakan operator + - * / normal, hanya dengan perpustakaan untuk memecah angka-angka dan menyimpannya secara internal sebagai beberapa nomor ukuran kata mesin (yaitu 32-bit). Ada juga fungsi tipe scanf () untuk menangani konversi input teks ke tipe integer.

Struktur mpz_tpersis seperti contoh Scott Chamberlain menghitung sampai 6 menggunakan dua tangan. Ini pada dasarnya adalah array dari mp_limb_ttipe-tipe ukuran kata mesin , dan ketika suatu angka terlalu besar untuk dapat ditampung dalam sebuah kata mesin, GMP menggunakan beberapa mp_limb_tuntuk menyimpan bagian-bagian nomor yang tinggi / rendah.

Animisme
sumber
5

Dalam pikiran Anda, Anda hanya tahu 10 digit berbeda. 0 hingga 9. Secara internal di otak Anda, ini tentu disandikan berbeda dari di komputer.

Komputer menggunakan bit untuk menyandikan angka, tetapi itu tidak penting. Itulah cara para insinyur memilih untuk menyandikan hal-hal, tetapi Anda harus mengabaikannya. Anda dapat menganggapnya sebagai komputer 32 bit yang memiliki representasi unik lebih dari 4 miliar nilai berbeda, sedangkan kita manusia memiliki representasi unik untuk 10 nilai berbeda.

Setiap kali kita harus memahami jumlah yang lebih besar, kita menggunakan suatu sistem. Angka paling kiri adalah yang paling penting. Ini 10 kali lebih penting daripada yang berikutnya.

Komputer yang dapat membedakan antara empat miliar nilai yang berbeda, juga harus membuat nilai paling kiri, dalam satu set nilai, menjadi empat miliar kali sama pentingnya dengan nilai berikutnya dalam set tersebut. Sebenarnya komputer tidak peduli sama sekali. Itu tidak menetapkan "kepentingan" untuk angka. Pemrogram harus membuat kode khusus untuk mengatasinya.

Setiap kali nilai menjadi lebih besar dari jumlah simbol unik, 9 dalam pikiran manusia, Anda menambahkan satu ke nomor di sebelah kiri.

3+3=6

Dalam hal ini, jumlahnya masih pas dengan satu "slot"

5+5=10. This situation is called an overflow.

Jadi manusia selalu berurusan dengan masalah tidak memiliki cukup simbol unik. Kecuali jika komputer memiliki sistem untuk menangani ini, itu hanya akan menulis 0, lupa bahwa ada angka tambahan. Untungnya, komputer memiliki "bendera melimpah" yang dimunculkan dalam kasus ini.

987+321 is more difficult.

Anda mungkin telah mempelajari metode di sekolah. Algoritma. Algoritma ini cukup sederhana. Mulailah dengan menambahkan dua simbol paling kiri.

7+1=8, we now have ...8 as the result so far

Kemudian Anda pindah ke slot berikutnya dan melakukan penambahan yang sama.

8+2=10, the overflow flag is raised. We now have ...08, plus overflow.

Karena kami mengalami overflow, itu artinya kami harus menambahkan 1 ke nomor berikutnya.

9+3=12, and then we add one due to overflow. ...308, and we had another overflow.

Tidak ada lagi angka untuk ditambahkan, jadi kami cukup membuat slot dan memasukkan 1 karena bendera meluap dinaikkan.

1308

Komputer melakukannya dengan cara yang persis sama, kecuali ia memiliki 2 ^ 32 atau bahkan lebih baik 2 ^ 64 simbol yang berbeda, bukan hanya 10 seperti manusia.

Pada tingkat perangkat keras, komputer bekerja pada bit tunggal menggunakan metode yang persis sama. Untungnya, itu disarikan untuk programmer. Bit hanya dua digit, karena itu mudah diwakili dalam saluran listrik. Entah lampu menyala, atau mati.

Akhirnya, komputer dapat menampilkan nomor apa pun sebagai urutan karakter sederhana. Itulah keunggulan komputer. Algoritma untuk mengkonversi antara urutan karakter, dan representasi internal cukup kompleks.

frodeborli
sumber
Dalam pikiran saya , saya tahu 36, tetapi saya biasanya hanya menggunakan 16 dari mereka.
Kyle Strand
"Komputer menggunakan bit untuk menyandikan angka, tetapi itu tidak penting." Dalam konteks pengguna bertanya tentang 32 bit kata dan bagaimana mereka digunakan untuk menyimpan angka lebih besar dari 2 ^ 32-1 adalah sangat penting.
HörmannHH
Tidaklah penting bagaimana Anda menyandikan angka dalam memori otak Anda. Anda memiliki jumlah representasi terbatas; kebanyakan telah belajar 10 simbol yang berbeda. Di dalam otak Anda, ini mungkin direpresentasikan dalam bentuk ribuan neuron dan sinapsis. Di komputer itu direpresentasikan dalam bentuk listrik atau tidak ada listrik pada saluran listrik. Dari perspektif pemrograman - atau ketika belajar matematika, itu tidak penting sama sekali, kecuali dalam kasus yang jarang terjadi di mana Anda pemrograman langsung untuk satu set CPU tertentu. Dia bertanya sekitar 32 bit vs 64 bit, bukan bit individual.
frodeborli
3

Karena Anda tidak menampilkan angka (sejauh menyangkut komputer), tetapi string , atau urutan digit. Tentu, beberapa aplikasi (seperti kalkulator, saya kira), yang berhubungan dengan angka, dapat menangani angka seperti itu, saya kira. Saya tidak tahu trik apa yang mereka gunakan ... Saya yakin beberapa yang lain, jawaban yang lebih rumit mencakup itu.

Rolf
sumber
0

Sebagian besar konten jawaban ini berasal dari jawaban ini (ditulis sebelum pertanyaan lain ditandai sebagai duplikat). Jadi saya membahas menggunakan nilai 8-bit (meskipun pertanyaan ini menanyakan nilai 32-bit), tapi tidak apa-apa karena nilai 8-bit lebih mudah untuk dipahami secara konseptual, dan konsep yang sama berlaku untuk nilai yang lebih besar seperti aritmatika 32-bit.

Ketika Anda menambahkan dua angka yang 8 bit, angka terbesar yang bisa Anda dapatkan (0xFF + 0xFF = 1FE). Bahkan, jika Anda mengalikan dua angka yang 8-bit, angka terbesar yang bisa Anda dapatkan (0xFF * 0xFF = 0xFE01) masih 16 bit, dua kali dari 8-bit.

Sekarang, Anda mungkin mengasumsikan bahwa prosesor x-bit hanya dapat melacak x-bit. (Misalnya, prosesor 8-bit hanya dapat melacak 8 bit.) Itu tidak akurat. Prosesor 8-bit menerima data dalam potongan 8-bit. ("Potongan" ini biasanya memiliki istilah formal: "kata". Pada prosesor 8-bit, kata 8-bit digunakan. Pada prosesor 64-bit, kata-kata 64 bit dapat digunakan.)

Jadi, ketika Anda memberikan komputer 3 byte:
Byte # 1: Instruksi MUL
Byte # 2: byte orde tinggi (misalnya, 0xA5)
Byte # 3: byte urutan yang lebih rendah (mis., 0xCB)
Komputer dapat menghasilkan hasil yang lebih dari 8 bit. CPU dapat menghasilkan hasil seperti ini:
0100 0000 0100 0010 xxxx xxxx xxxx xxxx 1101 0111
alias:
0x4082xxxxD7
Sekarang, izinkan saya mengartikannya untuk Anda:
0x hanya berarti angka-angka berikut adalah heksadesimal.
Saya akan membahas "40" lebih terinci untuk sementara waktu.
82 adalah bagian dari register "A", yang merupakan rangkaian 8 bit.
xx dan xx adalah bagian dari dua register lain, bernama register "B" dan register "C". Alasan mengapa saya tidak mengisi bit tersebut dengan nol atau yang adalah bahwa instruksi "ADD" (dikirim ke CPU) dapat mengakibatkan bit tersebut tidak berubah oleh instruksi (sedangkan sebagian besar bit lain yang saya gunakan dalam contoh ini mungkin diubah, kecuali untuk beberapa bit bendera).
D7 akan cocok dengan lebih banyak bit, disebut register "D".
Daftar hanyalah sepotong memori. Register dibangun ke dalam CPU, sehingga CPU dapat mengakses register tanpa perlu berinteraksi dengan memori pada RAM stick.

Jadi hasil matematika dari 0xA5 kali 0xCB adalah 0x82D7.

Sekarang, mengapa bit-bit itu dipecah menjadi register A dan D bukannya register A dan B, atau register C dan D? Nah, sekali lagi, ini adalah skenario sampel yang saya gunakan, yang dimaksudkan untuk konsep yang agak mirip dengan bahasa Assembly nyata (Intel x86 16-bit, seperti yang digunakan oleh Intel 8080 dan 8088 dan banyak CPU baru). Mungkin ada beberapa aturan umum, seperti register "C" yang biasanya digunakan sebagai indeks untuk menghitung operasi (tipikal untuk loop), dan register "B" digunakan untuk melacak offset yang membantu menentukan lokasi memori. Jadi, "A" dan "D" mungkin lebih umum untuk beberapa fungsi aritmatika yang umum.

Setiap instruksi CPU harus memiliki beberapa dokumentasi, yang digunakan oleh orang-orang yang memprogram dalam Assembly. Dokumentasi itu harus menentukan register apa yang digunakan oleh setiap instruksi. (Jadi pilihan register mana yang akan digunakan sering ditentukan oleh perancang CPU, bukan programmer bahasa Assembly. Meskipun, mungkin ada beberapa fleksibilitas.)

Sekarang, kembali ke "40" dalam contoh di atas: itu adalah serangkaian bit, sering disebut "flags register". Setiap bit dalam register bendera memiliki nama. Sebagai contoh, ada bit "overflow" yang dapat diatur CPU jika hasilnya lebih besar dari ruang yang dapat menyimpan satu byte hasil. (Bit "overflow" mungkin sering disebut dengan nama singkat "OF". Itu adalah huruf besar, bukan nol.) Perangkat lunak dapat memeriksa nilai bendera ini dan melihat "masalah". Bekerja dengan bit ini sering ditangani secara tak terlihat oleh bahasa tingkat yang lebih tinggi, sehingga programmer pemula sering tidak belajar tentang bagaimana berinteraksi dengan flag-flag CPU. Namun, programer Majelis dapat secara umum mengakses beberapa flag ini dengan cara yang sangat mirip dengan variabel lain.

Misalnya, Anda mungkin memiliki beberapa instruksi ADD. Satu instruksi ADD mungkin menyimpan 16 bit hasil dalam register A dan register D, sedangkan instruksi lain mungkin hanya menyimpan 8 bit rendah dalam register A, mengabaikan register D, dan menentukan bit overflow. Kemudian, nanti (setelah menyimpan hasil register A ke dalam RAM utama), Anda bisa menggunakan instruksi ADD lain yang menyimpan hanya 8 bit tinggi dalam register (mungkin register A.) Apakah Anda perlu menggunakan flag overflow mungkin tergantung pada instruksi perkalian apa yang Anda gunakan.

(Biasanya ada bendera "underflow", jika Anda mengurangi terlalu banyak agar sesuai dengan hasil yang diinginkan.)

Hanya untuk menunjukkan betapa rumitnya hal yang didapat:
Intel 4004 adalah CPU 4-bit
Intel 8008 adalah CPU 8-bit. Itu register 8-bit bernama A, B, C, dan D.
Intel 8086 adalah CPU 16-bit. Itu register 16-bit bernama AX, BX, CX, dan DX.
Intel 80386 adalah CPU 32-bit. Itu register 32-bit bernama EAX, EBX, ECX, dan EDX.
Intel x64 CPU memiliki register 64-bit bernama RAX, RBX, RCX, dan RDX. Chip x64 dapat menjalankan kode 16-bit (dalam beberapa mode operasi), dan dapat menafsirkan instruksi 16-bit. Saat melakukannya, bit yang membentuk register AX adalah setengah dari bit yang membentuk register EAX, yang merupakan setengah dari bit yang membentuk register RAX. Jadi, setiap kali Anda mengubah nilai AX, Anda juga mengubah EAX dan RAX, karena bit yang digunakan oleh AX adalah bagian dari bit yang digunakan oleh RAX. (Jika Anda mengubah EAX dengan nilai kelipatan 65.536, maka 16 bit rendah tidak berubah sehingga AX tidak akan berubah. Jika Anda mengubah EAX dengan nilai yang bukan kelipatan 65.536, maka itu akan mempengaruhi AX juga .)

Ada lebih banyak bendera dan register dari pada yang sudah saya sebutkan. Saya hanya memilih beberapa yang umum digunakan untuk memberikan contoh konseptual sederhana.

Sekarang, jika Anda menggunakan CPU 8-bit, ketika Anda menulis ke memori, Anda mungkin menemukan beberapa batasan untuk bisa merujuk ke alamat 8-bit, bukan alamat 4 bit atau 16-bit. Detailnya akan berbeda-beda berdasarkan CPU, tetapi jika Anda memiliki batasan seperti itu, maka CPU mungkin berurusan dengan kata-kata 8-bit, itulah sebabnya mengapa CPU paling sering disebut sebagai "CPU 8-bit".

TOOGAM
sumber
Saya merasa seperti bagian dari jawaban saya mengulangi beberapa jawaban lain untuk pertanyaan ini. Namun, ini tidak diperhatikan ketika saya pertama kali menulis konten karena saya menulis itu untuk pertanyaan lain. Juga, sementara saya menghargai jawaban Animism termasuk beberapa kode dalam bahasa C, saya merasa konten saya memberikan beberapa detail tentang bagaimana Assembly bekerja, yang lebih dekat dengan tindakan / desain aktual CPU. Jadi jawaban saya bukan mencoba menjadi jawaban superior yang "lebih baik daripada" semua yang lain, tetapi hanya tambahan; menambahkan perspektif lain dengan beberapa wawasan tambahan
TOOGAM