Bagaimana komputer menentukan apakah suatu angka lebih kecil atau lebih besar dari yang lain?

34

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?1<21,2,3,4,5,...

Ricky Stam
sumber
1
Agar pertanyaan ini dapat dijawab dengan memuaskan, kita harus tahu seberapa banyak yang diketahui Ricky Stam tentang arsitektur komputer. Dari pertanyaan itu sepertinya sangat sedikit, jadi tidak ada jawaban mewah di bawah ini yang bisa dipahami olehnya.
Andrej Bauer
@AndrejBauer: Sebenarnya, dia belum login sejak mengajukan pertanyaan. Mungkin dia sekarang tahu semua yang dia butuhkan.
Dave Clarke

Jawaban:

31

Pertama angka integer Anda dikonversi menjadi angka biner. Misalnya, bilangan bulat 2 dikonversi ke 0010.

CPU menggunakan pembanding digital :

Sebuah komparator digital atau besarnya pembanding adalah perangkat elektronik hardware yang mengambil dua angka sebagai input dalam bentuk biner dan menentukan apakah satu nomor lebih besar dari atau kurang dari atau sama dengan nomor lain.

Komparator digunakan dalam central processing unit (CPU) dan mikrokontroler.

Sumber: https://en.wikipedia.org/wiki/Digital_comparator

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.

Inputs           Outputs
A   B     A>B    A=B    A<B
0   0     0       1      0
0   1     0       0      1
1   0     1       0      0
1   1     0       1      0

Di sini 0& 1adalah 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 sebagaibinary-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:

 Inputs                            Outputs
   A1   A0  B1  B0  A>B    A=B   A<B        
    0   0   0   0    0      1     0
    0   0   0   1    1      0     0
    0   0   1   0    1      0     0
    0   0   1   1    1      0     0
    0   1   0   0    0      0     1
    0   1   0   1    0      1     0
    0   1   1   0    1      0     0
    0   1   1   1    1      0     0
    1   0   0   0    0      0     1
    1   0   0   1    0      0     1
    1   0   1   0    0      1     0
    1   0   1   1    1      0     0
    1   1   0   0    0      0     1
    1   1   0   1    0      0     1
    1   1   1   0    0      0     1
    1   1   1   1    0      1     0

Mengutip dari Wikipedia :

Contoh: Pertimbangkan dua angka biner 4-bit A dan B sedemikian rupa sehingga di
masukkan deskripsi gambar di sini
masukkan deskripsi gambar di sini
sini setiap subskrip mewakili salah satu digit dalam angka.

Persamaan

Angka-angka biner A dan B akan sama jika semua pasangan digit signifikan dari kedua angka sama, yaitu
masukkan deskripsi gambar di sini,. masukkan deskripsi gambar di sini. masukkan deskripsi gambar di sini. masukkan deskripsi gambar di sini

Karena angka-angka tersebut adalah biner, digitnya adalah 0 atau 1 dan fungsi boolean untuk persamaan dua digit masukkan deskripsi gambar di sinidan> masukkan deskripsi gambar di sinidapat dinyatakan sebagai
masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini adalah 1 hanya jika masukkan deskripsi gambar di sinidan masukkan deskripsi gambar di sini sama.

Untuk persamaan A dan B, semua masukkan deskripsi gambar di sinivariabel (untuk i = 0,1,2,3) harus 1. Jadi, kondisi kualitas A dan B dapat diimplementasikan menggunakan operasi AND sebagai
masukkan deskripsi gambar di sini
variabel biner (A = B) adalah 1 hanya jika semua pasangan angka dari dua angka sama.

Ketidaksamaan

Untuk menentukan secara manual lebih besar dari dua bilangan biner, kami memeriksa besaran relatif dari pasangan digit signifikan, mulai dari bit yang paling signifikan, secara bertahap melanjutkan menuju bit signifikan yang lebih rendah sampai ditemukan ketimpangan. Ketika ketimpangan ditemukan, jika bit yang sesuai dari A adalah 1 dan B adalah 0 maka kita menyimpulkan bahwa A> B. Perbandingan berurutan ini dapat dinyatakan secara logis sebagai:

masukkan deskripsi gambar di sini

Ravindra Bagale
sumber
2
Wah, apa yang terjadi di sini?
Gilles 'SO- stop being evil'
1
"Pertama angka integer Anda dikonversi menjadi angka biner" ... salah, hanya ada nomor biner di memori di tempat pertama, semua 1 dan 0 di tingkat mesin, jadi tidak ada "konversi", 2 adalah direpresentasikan sebagai 10 dari awal hingga akhir ..
Dr.Haimovitz
Saat menyalin materi dari sumber lain, Anda harus memberikan atribusi yang sesuai untuk sumber Anda. Lihat di sini dan di sini .
DW
Tabel komparator digital dua bit tidak benar. ijesi.org/papers/Vol(2)1%20(version%202)/C211324.pdf ketika A1, A0 sama-sama nol tetapi B0 dan B1 adalah 0, 1 A> B akan menjadi 0, misalnya.
user1455116
14

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.

Raphael
sumber
Juga, ini biasanya disebut " urutan leksikografis ". Kita biasanya dapat menganggapnya sebagai pemesanan pertama berdasarkan panjang (terpendek ke terpanjang), kemudian menurut abjad.
usul
@ Usul Itu mengingatkan saya bahwa rincian membandingkan bilangan bulat jelas tergantung pada pengkodean tertentu; apa yang saya jelaskan berfungsi untuk nomor biner "naif" yang mungkin jauh dari apa yang digunakan CPU sebenarnya.
Raphael
Yap, tentu saja. Saya telah berpikir tentang Mesin Turing terlalu banyak baru-baru ini :). Mesin nyata tidak cukup sesuai dengan apa yang kami katakan di sini setiap saat ....
usul
9

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.

Bartosz Przybylski
sumber
4

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: masukkan deskripsi gambar di sini

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!

Ethan
sumber
Ethan, bagaimana operasi "kurang" bekerja pada data ini? Seperti yang saya mengerti, Anda menggambarkan operasi "tidak sama". Apa instruksi "slt"?
osgx
2

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

  1. CPU menyimpan angka hingga (katakanlah) 64 bit dalam bentuk biner, dalam beberapa format (mungkin komplemen 2s tetapi tidak terlalu penting apa).

  2. 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.

Sebuahb

Sebuah-bSebuah-bkurang dari nol. Ini melakukan ini dengan operasi asli tunggal yang dapat bekerja, pada level rangkaian, seperti algoritma perbandingan yang dijelaskan oleh jawaban lain. Ini akan terlihat sangat mirip dengan itu, tetapi semua diimplementasikan dalam sirkuit (karena jumlahnya maksimal 64 bit, ini adalah sirkuit ukuran tertentu yang dapat kita hardwire dan tempelkan pada CPU.) Tergantung pada bagaimana CPU menyimpan angka, itu mungkin bahkan lebih cepat karena mungkin semua angka negatif memiliki bit pertama yang diatur ke satu, atau sesuatu seperti itu. Either way, hanya ada total 64 bit, jadi kami pasti dapat memeriksa apakah angka ini negatif.

Sebuah<bSebuahb

Sekarang, untuk jumlah yang lebih besar, kita harus mengimplementasikan sesuatu dalam perangkat lunak yang akan menggunakan perbandingan kecil ini sebagai subrutin.

usul
sumber
1

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.

A.Schulz
sumber
0

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:

  • masukan dua digit biner teratas sebagai pasangan (a, b)
  • jika a = 1 dan b = 0 angka kiri lebih besar.
  • jika a = 0 dan b = 1, angka yang tepat lebih besar.
  • kalau tidak angkanya "sama sampai sekarang", maju ke pasangan berikutnya.

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 bentukSebuah×10b, Sebuahmantissa, 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.

vzn
sumber