1 คะแนน โดย GN⁺ 2024-10-19 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

เหตุผล

  • ภาษา C ให้จำนวนบิตของไบต์เป็นค่าที่ขึ้นกับการติดตั้งผ่านแมโคร CHAR_BIT และ C++ ก็รับแนวทางนี้มาโดยตรง
  • ฮาร์ดแวร์สมัยใหม่ส่วนใหญ่กำลังมุ่งไปสู่สมมติฐานที่ว่าไบต์มีขนาด 8 บิต
  • เอกสารนี้เสนอให้ระบุอย่างเป็นทางการใน C++ ว่าไบต์มีขนาด 8 บิต
  • คอมไพเลอร์หลักต่างก็รองรับไบต์ 8 บิตอยู่แล้ว
    • GCC ตั้งค่าเริ่มต้นเป็น 8
    • LLVM ตั้ง __CHAR_BIT__ เป็น 8
    • MSVC กำหนด CHAR_BIT เป็น 8
  • POSIX กำหนดให้ใช้ไบต์ 8 บิตมาตั้งแต่ปี 2001
  • ซอฟต์แวร์ที่ไม่รองรับไบต์ 8 บิตจะไม่สามารถใช้งานร่วมกันได้

ผลกระทบต่อ C

  • ข้อเสนอนี้สำรวจว่า C++ ยังเกี่ยวข้องกับสถาปัตยกรรมที่ใช้ไบต์ที่ไม่ใช่ 8 บิตหรือไม่
  • คณะกรรมการภาษา C อาจได้ข้อสรุปที่ต่างออกไป และเป็นสิ่งที่พึงประสงค์หากทั้งสองคณะกรรมการมีความเห็นสอดคล้องกัน

ภาษา

  • ในโมเดลหน่วยความจำของ C++ หน่วยเก็บข้อมูลพื้นฐานคือไบต์ และไบต์ประกอบด้วย 8 บิต
  • แมโคร CHAR_BIT ถูกรายงานผ่านเฮดเดอร์ climits

ไลบรารี

  • เฮดเดอร์ climits กำหนดแมโครทั้งหมดเช่นเดียวกับเฮดเดอร์ไลบรารีมาตรฐาน C limits.h
  • เฮดเดอร์ cstdint ให้ชนิดจำนวนเต็มที่มีความกว้างตามที่กำหนด และแมโครที่ระบุขีดจำกัดของชนิดจำนวนเต็ม
  • ชนิดและแมโครทั้งหมดจะไม่เป็นแบบ optional เฉพาะในกรณีที่ไบต์มีขนาด 8 บิตเท่านั้น

สรุปโดย GN⁺

  • เอกสารนี้เป็นข้อเสนอที่ต้องการระบุอย่างเป็นทางการใน C++ ว่าไบต์มีขนาด 8 บิต
  • แพลตฟอร์มฮาร์ดแวร์และซอฟต์แวร์สมัยใหม่ส่วนใหญ่ใช้ไบต์ 8 บิตอยู่แล้ว จึงสมเหตุสมผลที่จะทำให้เป็นมาตรฐาน
  • สถาปัตยกรรมที่ใช้ไบต์ไม่ใช่ 8 บิตไม่เข้ากันกับ C++ สมัยใหม่ และความสำคัญของสถาปัตยกรรมเหล่านี้ก็กำลังลดลง
  • ข้อเสนอนี้ช่วยลดความซับซ้อนของ C++ และช่วยให้โปรแกรมเมอร์หน้าใหม่เข้าใจภาษาได้ง่ายขึ้น
  • โครงการอื่นที่มีแนวคิดคล้ายกันคือมาตรฐาน POSIX

1 ความคิดเห็น

 
GN⁺ 2024-10-19
ความคิดเห็นจาก Hacker News
  • มีการกล่าวถึง "Signed Integers are Two’s Complement" ในซีรีส์ของ JF ที่ชื่อว่า "Can we acknowledge that every real computer works this way?"

    • เคยมีประสบการณ์เขียนโค้ด C บนเครื่อง BBN C/70 ที่ใช้ไบต์ 10 บิต ระหว่างการฝึกงานในปี 1986
    • มันเป็นเครื่องที่มีอยู่ได้ด้วยแนวคิดแบบจักรวาลด้านลบ
  • ภาษา D ถือเป็นความก้าวหน้าครั้งใหญ่ในแง่ต่อไปนี้

    • ไบต์คือ 8 บิต
    • short คือ 16 บิต
    • int คือ 32 บิต
    • long คือ 64 บิต
    • การคำนวณใช้ two’s complement
    • ใช้ IEEE floating point
    • ช่วยประหยัดเวลาที่สูญไปกับการพยายามสร้าง abstraction แบบนี้แล้วได้ผลลัพธ์ที่ผิด
    • ใช้ Unicode เป็นชุดอักขระ
  • บางคนก็ยังคงทำงานกับ DSP อยู่

  • โดยส่วนตัวรู้สึกว่าสนุกกับการทำเอกสารให้แฟนตาซีคอนโซล 12 บิตที่ "ให้จำนวนบิตต่อไบต์มากกว่าคู่แข่ง 50%"

  • มีคำถามว่า C++ จะเลิกใช้หรือทำให้เรื่องใดง่ายลงได้บ้าง

    • ได้ยินมาว่าฟังก์ชัน rand() มีปัญหาและแก้ไขไม่ได้ และก็ยังได้ยินว่าแม้ตอนนี้ก็ยังไม่ถูกเลิกใช้
  • มีความรู้สึกก้ำกึ่งกับเรื่องที่ว่าไม่มีการใช้งานที่มีความหมายสำหรับค่า CHAR_BIT ที่ไม่ใช่ 8

    • โดยส่วนตัวมองว่าความพยายามทำความเข้าใจสิ่งที่เกิดขึ้นภายในคอมพิวเตอร์ด้วยโมเดลแบบทำให้ง่ายลง สุดท้ายก็จะชนเข้ากับข้อจำกัด
    • ความนิยมของโปรเจ็กต์อิเล็กทรอนิกส์เชิงกายภาพในหมู่ผู้เริ่มต้นกำลังเพิ่มขึ้น
  • ขอบคุณที่ให้ความสนใจต่อข้อเสนอนี้ และได้จัดทำร่างฉบับปรับปรุงโดยอิงจากข้อเสนอแนะแล้ว

  • ชอบไอเดียของเรโทรไมโครคอมพิวเตอร์แบบไบต์ 6 บิต

    • โดยทั่วไปไมโครคอมพิวเตอร์มักจัดการกับอ็อบเจ็กต์จำนวนน้อย และนิยมใช้อาร์เรย์มากกว่าพอยน์เตอร์
    • VGA ใช้ 6 บิตต่อสี และสามารถมีตัวอักษรที่อ่านได้บนเมทริกซ์ 6x4 บิต
    • หน่วยความจำ 12MiB และ 6 บิตที่แอดเดรสได้อย่างอิสระก็น่าจะเพียงพอ
  • เห็นด้วยกับการบังคับให้ int8_t == char == 8 บิต แต่ยังไม่มั่นใจว่าควรกระจายความเข้าใจว่าไบต์เท่ากับ 8 บิต

    • เพราะไบต์เป็น "ชื่อเรียกอีกอย่าง" ของ char อยู่แล้วตั้งแต่ C++17 เป็นต้นมา