Ini mungkin terdengar seperti pertanyaan bodoh, tetapi saya benar-benar ingin tahu bagaimana komputer mengetahui bahwa ? Juga, bagaimana komputer mengetahui bahwa urutan bilangan bulat adalah dan alfabet adalah A, B, C, D, ...? Apakah di suatu tempat tersimpan di perangkat keras atau apakah sistem operasi menyediakan informasi semacam ini?
computer-architecture
reference-question
Ricky Stam
sumber
sumber
Jawaban:
Pertama angka integer Anda dikonversi menjadi angka biner. Misalnya, bilangan bulat 2 dikonversi ke 0010.
CPU menggunakan pembanding digital :
Dalam perangkat keras pembanding beberapa gerbang digunakan (AND, OR, NAND, NOR, XOR, dll). Gerbang ini mengambil input biner dan memberikan hasil dalam biner. Outputnya bisa dilihat dari tabel kebenaran.
Di sini
0
&1
adalah tegangan elektronik untuk pintu gerbang.1
- Merupakan beberapa tegangan ambang yang menunjukkan beberapa tegangan positif.0
- Merupakan tegangan di bawah ambang batas.Misalkan misalkan komparator bekerja pada 5 volt (pertimbangan untuk penjelasan) maka:
Tegangan lebih dari 3 volt dapat dianggap sebagai
binary-1
.Tegangan di bawah 3 volt dianggap sebagai
binary-0
Jika sebuah gerbang mendapat satu input sebagai 3,5 volt dan input lainnya sebagai 2 volt maka dianggap sebagai, dibutuhkan satu input sebagai biner 1 & input lain sebagai biner 0.
Urutan 1's & 0's ini disediakan dengan sangat cepat melalui rangkaian switching.
Pengoperasian pembanding digital dua bit dapat dinyatakan sebagai tabel kebenaran:
Mengutip dari Wikipedia :
sumber
Itu tidak hanya "tahu", itu memeriksa setiap waktu. Pada dasarnya, ia melakukan hal yang sama yang akan Anda lakukan: untuk membandingkan, ia memeriksa (dari kiri) nomor mana yang memiliki digit pertama yang lebih besar daripada yang sesuai di nomor lainnya. Tentu saja Anda harus menambahkan angka nol di depan ke angka yang lebih pendek.
Surat hanyalah angka untuk komputer. Manusia telah menetapkan nomor, misalnya ASCII atau Unicode , ke huruf sehingga perbandingan angka memberikan urutan huruf yang "benar" juga.
sumber
Bukan sistem operasi yang membandingkan bilangan bulat, CPU yang mengurusnya. Itu dibuat pada tingkat gerbang logis, lihat slide ini untuk melihat bagaimana hal itu bisa dilakukan.
Tentang alfabet, dalam ASCII, alfanumerik dan karakter khusus lainnya direpresentasikan sebagai bilangan bulat sehingga membandingkannya juga merupakan operasi perbandingan bilangan bulat, yang dilakukan oleh CPU.
sumber
Sebenarnya, dan untuk mendapatkan gambar penuh dari itu, saya pikir akan sangat membantu untuk melihat dengan mata kepala sendiri datapath dari CPU yang sebenarnya, misalnya MIPS:
Seperti yang Anda lihat, sebenarnya ada output kedua dari ALU, yang merupakan sinyal yang disebut Nol. Itu ada untuk melakukan operasi cabang cepat, setelah menentukan apakah dua operan perbandingan sama dengan nol atau tidak , karena sebagian besar perbandingan dalam suatu program adalah tentang cabang. Karena itu, ketika Anda membuat kemungkinan cabang dalam kode Anda seperti:
jika (a <b) {...}
Perhatikan bahwa sinyal nol adalah salah satu input dari gerbang AND yang menentukan di mana Program Counter (PC) akan mengambil nilainya dari: Asumsikan bahwa sinyal Cabang adalah '1', karena kami memiliki operasi cabang
Semoga saya membantu Anda melihat "di bawah kap". Jangan ragu untuk meminta analisis lebih lanjut tentang masalah ini. Banyak hal yang kami terima begitu saja, CPU melakukannya dengan cara yang sangat menarik!
sumber
Jika Anda ingin tahu tentang bagaimana CPU yang sebenarnya melakukannya, itu seperti ini.
CPU beroperasi pada jumlah hanya hingga ukuran tertentu. Saat ini biasanya bilangan bulat 64-bit (kami akan mengabaikan angka floating-point; idenya akan serupa).
Jadi kita harus mengenalinya
CPU menyimpan angka hingga (katakanlah) 64 bit dalam bentuk biner, dalam beberapa format (mungkin komplemen 2s tetapi tidak terlalu penting apa).
CPU tidak dapat melakukan apa pun dengan angka yang lebih besar dari itu. Kita harus menulis algoritma perangkat lunak jika kita ingin membandingkan angka yang lebih besar.
Sekarang, untuk jumlah yang lebih besar, kita harus mengimplementasikan sesuatu dalam perangkat lunak yang akan menggunakan perbandingan kecil ini sebagai subrutin.
sumber
Untuk menjawab pertanyaan ini, pertama-tama saya tunjukkan bahwa setidaknya ada dua level abstraksi untuk angka perbandingan di komputer, level mesin , dan level perangkat lunak .
Membandingkan angka pada level mesin
Di komputer saat ini CPU memiliki serangkaian instruksi yang kaya. Instruksi ini termasuk misalnya memuat sel memori ke dalam register, menambah register, menambahkan dua register, dan banyak lagi. Juga harus ada instruksi untuk lompatan bersyarat . Misalnya prosesor dalam keluarga Intel x86 mendukung instruksi
jnz
(melompat jika tidak nol),jne
(melompat tidak sama), dan sebagainya. Jika itu akan hilang maka CPU tidak akan Turing-lengkap. Variabel-variabel dari mana lompatan bergantung bergantung disimpan dalam register. Dengan demikian, instruksi ini terprogram dalam arsitektur CPU sebagai rangkaian membangun dari gerbang logis. Ini adalah satu-satunya cara bagaimana CPU dapat membandingkan dua angka.Membandingkan angka pada level perangkat lunak
Jika Anda membandingkan dua angka, ucapkan dalam program c ++, maka ini diterjemahkan ke dalam kode mesin dan karenanya dilakukan pada tingkat mesin. Namun, perbandingan seperti itu bisa lebih kompleks. Itu sangat tergantung pada tipe data yang Anda gunakan bagaimana perbandingan diterjemahkan ke dalam kode mesin. Hanya satu contoh, angka yang ingin Anda bandingkan berasal dari kata-kata 64 Bit tetapi mesin Anda hanya bekerja dengan 32 bit. Maka nomor ini tidak cocok dalam register, maka kompiler akan memecah perbandingan menjadi urutan perbandingan pada level kode mesin. Hal yang sama berlaku untuk tipe data yang lebih rumit / struktur data, mewakili misalnya bilangan rasional, atau string, atau karakter. Karenanya ketika Anda harus membandingkan dua karakter, ini harus diterjemahkan oleh perangkat lunak (sistem operasi, kompiler, juru bahasa, ...) ke dalam kode mesin.
Sebagai komentar terakhir saya ingin menunjukkan bahwa CPU standar juga dapat bekerja dengan representasi angka yang berbeda (bilangan bulat bertanda 1 atau 2-pelengkap representasi, mengapung). Juga perbandingan dapat dilakukan di bagian lain dari komputer seperti GPU.
sumber
jawaban lain baik, hanya melemparkan yang lain di luar sana untuk pertimbangan / wawasan lebih lanjut dengan rasa CS / twist. seseorang dapat membangun FSM , sebuah mesin keadaan terbatas, yang dapat membandingkan dua bilangan biner dengan panjang berapa pun, mulai berpasangan dari bit paling signifikan dan bekerja ke bit paling tidak signifikan (LSB). itu juga dapat digunakan untuk membuat konsep pembanding digital yang diberikan dalam jawaban lain, namun FSM tidak memerlukan angka biner panjang terbatas. bahkan dapat bekerja pada bilangan bulat dengan fraksi biner setelah LSB. ini memiliki rasa induktif dan rekursif dan dapat dibuktikan benar dengan induksi sederhana. ini berjalan sebagai berikut:
dengan kata lain, angka terbesar adalah angka dengan kemunculan pertama bit yang satu dan yang lainnya nol, setelah putaran pertama nol atau lebih identik 1. komparator digital terbatas-panjang yang terbuat dari gerbang atau pembanding 1-bit dapat dilihat berdasarkan pada perbaikan panjang operasi FSM ini ke sejumlah bit tertentu. (ya ada korespondensi yang kuat antara semua sirkuit hingga dan "memperbaiki panjang" perhitungan FSM.)
ini mungkin tampak seperti latihan teoritis tetapi sebenarnya, logika dalam perangkat lunak untuk mewakili angka presisi acak mengoperasikan sesuatu yang analog dengan FSM ini, kecuali dikodekan dalam loop komputer yang dapat dilihat sebagai perulangan atau mensimulasikan langkah-langkah FSM (implementasi yang efisien mungkin melacak melalui indeks lokasi MSB).
juga, mari secara wajar menafsirkan / menggeneralisasi pertanyaan ini sebagai tidak terbatas pada bilangan bulat . pertanyaannya mengacu pada bilangan bulat tetapi judulnya hanya mengacu pada angka. mengherankan tidak ada lagi yang menyebutkan aritmatika floating point sejauh ini.
pada dasarnya itu bekerja dengan membandingkan eksponen dan mantissa di mana angka dalam bentuka × 10b , Sebuah mantissa, b eksponen. mantissa dapat dinormalisasi ke angka di mana digit pertama selalu nol. kemudian untuk membandingkan dua angka, logikanya pertama membandingkan eksponenb , dan jika mereka tidak sama, itu dapat mengembalikan hasil tanpa membandingkan mantra (menggunakan katakanlah rangkaian komparator). jika eksponennya sama, itu membandingkan mantisa.
sumber