1 điểm bởi GN⁺ 2024-10-19 | 1 bình luận | Chia sẻ qua WhatsApp

Cơ sở

  • Ngôn ngữ C cung cấp số bit trong một byte dưới dạng định nghĩa phụ thuộc triển khai thông qua macro CHAR_BIT, và C++ cũng kế thừa nguyên trạng điều này
  • Phần lớn phần cứng hiện đại đều hội tụ về giả định rằng byte là 8 bit
  • Tài liệu này đề xuất chính thức nêu rõ trong C++ rằng byte là 8 bit
  • Các trình biên dịch chính đã hỗ trợ byte 8 bit
    • GCC đặt giá trị mặc định là 8
    • LLVM đặt __CHAR_BIT__ là 8
    • MSVC định nghĩa CHAR_BIT là 8
  • POSIX đã yêu cầu byte 8 bit từ năm 2001
  • Phần mềm không hỗ trợ byte 8 bit sẽ không tương thích

Ảnh hưởng tới C

  • Đề xuất này xem xét liệu C++ còn có ý nghĩa với các kiến trúc sử dụng byte không phải 8 bit hay không
  • Ủy ban ngôn ngữ C có thể đi đến kết luận khác, và lý tưởng nhất là hai ủy ban đạt được sự thống nhất

Ngôn ngữ

  • Trong mô hình bộ nhớ của C++, đơn vị lưu trữ cơ bản là byte, và byte gồm 8 bit
  • Macro CHAR_BIT được khai báo trong header climits

Thư viện

  • Header climits định nghĩa mọi macro giống hệt header thư viện chuẩn C limits.h
  • Header cstdint cung cấp các kiểu số nguyên có độ rộng xác định và các macro chỉ định giới hạn của kiểu số nguyên
  • Mọi kiểu và macro chỉ không còn là tùy chọn khi byte là 8 bit

Tóm tắt của GN⁺

  • Tài liệu này là một đề xuất nhằm chính thức nêu rõ trong C++ rằng byte là 8 bit
  • Phần lớn nền tảng phần cứng và phần mềm hiện đại đều sử dụng byte 8 bit, nên việc chuẩn hóa điều này là hợp lý
  • Các kiến trúc byte không phải 8 bit không tương thích với C++ hiện đại, và tầm quan trọng của các kiến trúc này đang giảm dần
  • Đề xuất này giúp giảm độ phức tạp của C++ và giúp lập trình viên mới hiểu ngôn ngữ dễ hơn
  • Một dự án khác có chức năng tương tự là tiêu chuẩn POSIX

1 bình luận

 
GN⁺ 2024-10-19
Ý kiến trên Hacker News
  • Trong loạt bài của JF với câu "Can we acknowledge that every real computer works this way?", đã có nhắc đến "Signed Integers are Two’s Complement"

    • Trong kỳ thực tập năm 1986, đã từng viết mã C trên máy BBN C/70 sử dụng byte 10 bit
    • Đây là loại máy tồn tại do một kiểu tư duy đến từ vũ trụ phản diện
  • Ngôn ngữ D đã tạo ra bước tiến lớn ở các điểm sau

    • byte là 8 bit
    • short là 16 bit
    • int là 32 bit
    • long là 64 bit
    • số học dùng bù hai
    • dấu phẩy động IEEE
    • điều này giúp tiết kiệm thời gian bị lãng phí vào việc cố gắng trừu tượng hóa những thứ này rồi nhận kết quả sai
    • Unicode được dùng làm bộ ký tự
  • Một số người vẫn đang làm việc với DSP

  • Cá nhân tôi thấy khá thú vị khi viết tài liệu cho một máy chơi game giả tưởng 12 bit với khẩu hiệu "nhiều hơn 50% số bit trên mỗi byte so với đối thủ"

  • Có câu hỏi về những gì C++ có thể loại bỏ hoặc đơn giản hóa

    • Tôi từng nghe rằng hàm rand() bị lỗi và không thể sửa được, và cũng nghe rằng đến giờ nó vẫn chưa bị loại bỏ
  • Tôi có cảm xúc lẫn lộn trước việc CHAR_BIT không còn công dụng đáng kể nào nếu khác 8

    • Cá nhân tôi cho rằng mọi nỗ lực nhằm hiểu những gì diễn ra bên trong máy tính bằng một mô hình đơn giản hóa rồi cũng sẽ đụng phải giới hạn
    • Các dự án điện tử vật lý đang ngày càng phổ biến hơn trong giới mới bắt đầu
  • Cảm ơn mọi người đã quan tâm đến đề xuất; dựa trên phản hồi, tôi đã viết một bản nháp cập nhật

  • Tôi thích ý tưởng về một máy vi tính retro với byte 6 bit

    • Máy vi tính thường xử lý số lượng đối tượng nhỏ và ưu tiên mảng hơn con trỏ
    • VGA dùng 6 bit cho mỗi màu, và có thể có một bảng chữ cái đọc được trong ma trận 6x4 bit
    • 12MiB bộ nhớ cùng với các đơn vị 6 bit có thể định địa chỉ độc lập có lẽ là đủ
  • Tôi đồng ý với việc ép int8_t == char == 8 bit, nhưng không chắc về việc lan truyền quan niệm rằng byte là 8 bit

    • byte vốn đã là một "bí danh" của char kể từ C++17