Pada dasarnya setiap komputer modern adalah mesin yang mendorong sedikit. Biasanya itu mendorong bit di dalam kelompok data, yang disebut byte, kata, kata atau qwords.
Satu byte terdiri dari 8 bit, satu kata 2 byte (atau 16 bit), satu kata 2 kata (atau 32 bit) dan satu kata kata 2 kata (atau 64 bit). Ini bukan satu-satunya cara untuk mengatur bit. Manipulasi 128 bit dan 256 bit juga terjadi, seringkali dalam instruksi SIMD.
Instruksi perakitan beroperasi pada register dan alamat memori biasanya beroperasi dalam salah satu formulir di atas.
ALU (unit aritmatika logika) beroperasi pada kumpulan bit seperti jika mereka mewakili bilangan bulat (biasanya format Komplemen Dua), dan FPU seolah-olah mereka di mana nilai-nilai titik mengambang (biasanya gaya IEEE 754 float
dan double
). Bagian lain akan bertindak seolah-olah mereka adalah kumpulan data dari beberapa format, karakter, entri tabel, instruksi CPU, atau alamat.
Pada komputer 64 bit yang khas, bundel 8 byte (64 bit) adalah alamat. Kami menampilkan alamat ini secara konvensional dalam format hex (seperti 0xabcd1234cdef5678
), tetapi itu hanya cara mudah bagi manusia untuk membaca pola bit. Setiap byte (8 bit) ditulis sebagai dua karakter hex (ekuivalen setiap hex karakter - 0 hingga F - mewakili 4 bit).
Apa yang sebenarnya terjadi (untuk beberapa tingkat sebenarnya) adalah bahwa ada bit, biasanya disimpan dalam register atau disimpan di lokasi yang berdekatan di bank memori, dan kami hanya mencoba menggambarkannya kepada manusia lain.
Mengikuti pointer terdiri dari meminta pengontrol memori untuk memberi kami beberapa data di lokasi itu. Anda biasanya akan meminta pengontrol memori untuk sejumlah byte di lokasi tertentu (well, secara implisit berbagai lokasi, biasanya berdekatan), dan dikirimkan melalui berbagai mekanisme yang tidak akan saya bahas.
Kode biasanya menentukan tujuan untuk data yang akan diambil - register, alamat memori lain, dll - dan biasanya itu adalah ide yang buruk untuk memuat data floating point ke dalam register yang mengharapkan integer, atau sebaliknya.
Jenis data dalam C / C ++ adalah sesuatu yang dicatat oleh kompiler, dan itu mengubah kode apa yang dihasilkan. Biasanya tidak ada yang intrinsik dalam data yang membuatnya benar - benar dari jenis apa pun. Hanya kumpulan bit (disusun dalam bytes) yang dimanipulasi dengan cara seperti integer (atau cara seperti float, atau cara seperti alamat) oleh kode.
Ada pengecualian untuk ini. Ada arsitektur di mana hal-hal tertentu berbeda jenis bit. Contoh paling umum adalah halaman eksekusi yang dilindungi - sementara instruksi memberitahu CPU apa yang dilakukan adalah bit, pada saat run time (memori) halaman yang berisi kode untuk dieksekusi ditandai secara khusus, tidak dapat dimodifikasi, dan Anda tidak dapat mengeksekusi halaman yang tidak ditandai. sebagai halaman eksekusi.
Ada juga hanya baca data (kadang-kadang disimpan dalam ROM yang secara fisik tidak dapat ditulis ke!), Masalah penyelarasan (beberapa prosesor tidak dapat memuat double
dari memori kecuali mereka disejajarkan dengan cara tertentu, atau instruksi SIMD yang memerlukan penyelarasan tertentu), dan berjuta-juta kebiasaan arsitektur lainnya.
Bahkan tingkat detail di atas adalah bohong. Komputer tidak "benar-benar" mendorong bit, mereka benar-benar mendorong voltase dan arus. Tegangan dan arus ini terkadang tidak melakukan apa yang "seharusnya" dilakukan pada tingkat abstraksi bit. Chip dirancang untuk mendeteksi sebagian besar kesalahan seperti itu dan memperbaikinya tanpa abstraksi tingkat yang lebih tinggi harus menyadarinya.
Bahkan itu bohong.
Setiap level abstraksi menyembunyikan yang di bawah ini, dan memungkinkan Anda berpikir tentang menyelesaikan masalah tanpa harus mengingat diagram Feynman untuk dicetak "Hello World"
.
Jadi pada tingkat kejujuran yang cukup, komputer mendorong bit, dan bit-bit itu diberi makna oleh bagaimana mereka digunakan.