Về cơ bản mỗi máy tính hiện đại là một máy đẩy bit. Thông thường, nó đẩy các bit xung quanh trong cụm dữ liệu, được gọi là byte, từ, từ hoặc qwords.
Một byte bao gồm 8 bit, một từ 2 byte (hoặc 16 bit), một từ 2 từ (hoặc 32 bit) và một từ 2 từ khóa (hoặc 64 bit). Đây không phải là cách duy nhất để sắp xếp bit. Thao tác 128 bit và 256 bit cũng xảy ra, thường là trong hướng dẫn SIMD.
Hướng dẫn lắp ráp hoạt động trên các thanh ghi và địa chỉ bộ nhớ thường hoạt động theo một trong các hình thức trên.
ALU (đơn vị logic số học) hoạt động trên các bó bit như thể chúng đại diện cho các số nguyên (thường là định dạng Bổ sung của hai) và FPU như thể chúng có các giá trị dấu phẩy động (thường là kiểu IEEE 754 float
và double
). Các phần khác sẽ hoạt động như thể chúng là dữ liệu được đóng gói theo một số định dạng, ký tự, mục nhập bảng, hướng dẫn CPU hoặc địa chỉ.
Trên máy tính 64 bit thông thường, các gói 8 byte (64 bit) là địa chỉ. Chúng tôi hiển thị các địa chỉ này theo cách thông thường ở định dạng hex (như 0xabcd1234cdef5678
), nhưng đó chỉ là một cách dễ dàng để con người đọc các mẫu bit. Mỗi byte (8 bit) được viết dưới dạng hai ký tự hex (tương đương mỗi ký tự hex - 0 đến F - đại diện cho 4 bit).
Điều thực sự đang diễn ra (đối với một số mức thực tế) là có các bit, thường được lưu trữ trong một thanh ghi hoặc được lưu trữ ở các vị trí liền kề trong một ngân hàng bộ nhớ và chúng tôi chỉ cố gắng mô tả chúng cho một người khác.
Theo sau một con trỏ bao gồm yêu cầu bộ điều khiển bộ nhớ cung cấp cho chúng tôi một số dữ liệu tại vị trí đó. Bạn thường yêu cầu bộ điều khiển bộ nhớ cho một số byte nhất định tại một vị trí nhất định (tốt, hoàn toàn là một phạm vi vị trí, thường liền kề nhau) và nó được phân phối thông qua các cơ chế khác nhau mà tôi sẽ không tham gia.
Mã thường chỉ định đích để dữ liệu được tìm nạp - một thanh ghi, một địa chỉ bộ nhớ khác, v.v. - và thường thì việc tải dữ liệu dấu phẩy động vào một thanh ghi mong đợi một số nguyên hoặc ngược lại là một ý tưởng tồi.
Kiểu dữ liệu trong C / C ++ là thứ mà trình biên dịch theo dõi và nó thay đổi mã được tạo. Thông thường không có gì nội tại trong dữ liệu làm cho nó thực sự thuộc bất kỳ một loại nào. Chỉ là một tập hợp các bit (được sắp xếp thành byte) được xử lý theo cách giống như số nguyên (hoặc cách giống như float hoặc theo cách giống như địa chỉ) theo mã.
Có nhiều ngoại lệ cho cái này. Có những kiến trúc trong đó những thứ nhất định là một loại bit khác nhau . Ví dụ phổ biến nhất là các trang thực thi được bảo vệ - trong khi các hướng dẫn cho CPU biết các bit thực hiện là gì, tại thời điểm chạy, các trang (bộ nhớ) chứa mã để thực thi được đánh dấu đặc biệt, không thể sửa đổi và bạn không thể thực thi các trang không được đánh dấu như các trang thực hiện.
Ngoài ra còn có dữ liệu chỉ đọc (đôi khi được lưu trữ trong ROM mà không thể ghi vào vật lý!), Các vấn đề căn chỉnh (một số bộ xử lý không thể tải double
s từ bộ nhớ trừ khi chúng được căn chỉnh theo các cách cụ thể hoặc hướng dẫn SIMD yêu cầu căn chỉnh nhất định) và vô số kiến trúc khác quirks.
Ngay cả mức độ chi tiết trên là một lời nói dối. Máy tính không "thực sự" đẩy xung quanh bit, chúng thực sự đang đẩy xung quanh điện áp và dòng điện. Các điện áp và dòng điện này đôi khi không làm những gì chúng được cho là "phải làm" ở mức độ trừu tượng của các bit. Các chip được thiết kế để phát hiện hầu hết các lỗi như vậy và sửa chúng mà không cần sự trừu tượng hóa ở cấp độ cao hơn.
Thậm chí đó là một lời nói dối.
Mỗi cấp độ trừu tượng ẩn cái bên dưới và cho phép bạn suy nghĩ về việc giải quyết vấn đề mà không cần phải ghi nhớ sơ đồ Feynman để in ra "Hello World"
.
Vì vậy, ở mức độ trung thực đủ, máy tính đẩy các bit và các bit đó được cho ý nghĩa bằng cách chúng được sử dụng.