แพลตฟอร์มใดมีสิ่งอื่นที่ไม่ใช่ถ่าน 8 บิต


136

ทุกขณะนี้แล้วคนอื่นที่ใช้จุดเพื่อออกว่าchar(aka 'ไบต์') ไม่จำเป็นต้องเป็น 8 บิต

ดูเหมือนว่า 8 บิตcharนั้นเกือบจะเป็นสากล ฉันจะคิดว่าสำหรับแพลตฟอร์มหลักจำเป็นต้องมี 8 บิตcharเพื่อให้แน่ใจว่ามีศักยภาพในตลาด

ทั้งในตอนนี้และในอดีตแพลตฟอร์มใดที่ใช้charไม่ได้เป็น 8 บิตและทำไมพวกเขาถึงแตกต่างจาก "ปกติ" 8 บิต

เมื่อเขียนโค้ดและคิดถึงการสนับสนุนข้ามแพลตฟอร์ม (เช่นสำหรับไลบรารีที่ใช้งานทั่วไป) สิ่งที่ควรคำนึงถึงในการให้แพลตฟอร์มที่ไม่ใช่ non-8-bit charคืออะไร

ในอดีตที่ผ่านมาฉันได้พบกับ Analog Devices DSP บางตัวซึ่งcharเป็น 16 บิต DSP เป็นบิตของสถาปัตยกรรมเฉพาะที่ฉันคิดว่า (จากนั้นอีกครั้งในขณะที่แอสเซมเบลอร์ที่เขียนด้วยมือสามารถเอาชนะสิ่งที่คอมไพเลอร์ C ที่มีอยู่สามารถทำได้ดังนั้นฉันจึงไม่ได้รับประสบการณ์มากกับ C บนแพลตฟอร์มนั้น)


9
CDC Cyber ​​series มีการเข้ารหัส 6/12 บิต ตัวละครที่ได้รับความนิยมมากที่สุดคือ 6 บิต อักขระที่เหลือใช้ 12 บิต
โทมัสแมตทิวส์

2
PDP-11 ตอกลง ความคิดที่ว่าตัวละครสามารถเข้ารหัสในตัวละครนั้นล้าสมัยไปแล้วอย่างจริงจัง
ฮันส์แพสแตนท์

7
"PDP-11 ตอกลง" - คุณหมายถึงเพราะ C ถูกนำไปใช้กับ PDP-11 ครั้งแรกด้วยไบต์ 8 บิต? แต่ C ถูกนำไปใช้กับเครื่อง Honeywell ขนาด 9 บิตต่อไป ดูรุ่น K&R 1 นอกจากนี้คำถามที่ถามเกี่ยวกับ char (เช่นไบต์) ไม่เกี่ยวกับตัวละคร (หนึ่งไบต์ขึ้นไปเข้ารหัสสิ่งที่ไม่ได้ถาม)
โปรแกรมเมอร์ Windows

6
DEC-10 และ DEC-20 มีคำศัพท์ 36 บิต อักขระ ASCII 7 บิตห้าตัวต่อคำเป็นเรื่องปกติ นอกจากนี้ยังมีการใช้อักขระ 6 บิตหกตัว
David R Tribble

3
@CraigMcQueen: ถ้าฉันจำได้อย่างถูกต้อง CodeVision สำหรับไมโครคอนโทรลเลอร์ Atmel ให้เลือกขนาดของถ่าน
vsz

คำตอบ:


80

charยังเป็น 16 บิตสำหรับ Texas Instruments C54x DSPs ซึ่งเปิดตัวอย่างเช่นใน OMAP2 มีประมวลสัญญาณอื่น ๆ ออกมีกับ 16 และ 32 charบิต ฉันคิดว่าฉันเคยได้ยินเกี่ยวกับ DSP 24 บิต แต่ฉันจำไม่ได้ว่าอะไรดังนั้นฉันจึงอาจจินตนาการได้

CHAR_BIT == 8การพิจารณาก็คือว่าเอกสาร POSIX ดังนั้นหากคุณใช้ POSIX คุณสามารถสันนิษฐานได้ หากในภายหลังมีใครบางคนต้องการย้ายรหัสของคุณไปยัง POSIX ใกล้จะเกิดขึ้นนั่นก็เกิดขึ้นกับฟังก์ชั่นที่คุณใช้ แต่ขนาดที่แตกต่างกันcharนั่นคือโชคร้ายของพวกเขา

โดยทั่วไปแล้วฉันคิดว่ามันง่ายกว่าในการแก้ไขปัญหามากกว่าที่จะคิดถึงมัน CHAR_BITเพียงพิมพ์ หากคุณต้องการที่แน่นอนชนิด 8 int8_tบิตการใช้งาน โค้ดของคุณจะไม่สามารถคอมไพล์ในการติดตั้งที่ไม่ได้จัดเตรียมไว้อย่างเงียบ ๆ แทนที่จะใช้ขนาดที่คุณไม่คาดคิด อย่างน้อยที่สุดถ้าฉันโดนกรณีที่ฉันมีเหตุผลที่ดีที่จะคิดมันก็จะยืนยัน


2
TI C62xx และ C64xx DSPs ยังมีตัวอักษร 16 บิต (uint8_t ไม่ได้ถูกกำหนดไว้บนแพลตฟอร์มนั้น)
myron-semack

7
DSP จำนวนมากสำหรับการประมวลผลเสียงเป็นเครื่อง 24 บิต BelaSignaประมวลสัญญาณจากบนกึ่งพ่วง (หลังจากที่พวกเขาซื้อ AMI กึ่ง); DSP56K / ซิมโฟนีเสียง DSPs จาก Freescale (หลังจากที่พวกเขาปั่นออกจากโมโตโรล่า)
เดวิดแครี

2
@msemack C64xx มีฮาร์ดแวร์สำหรับ 8/16/32/40 และ 8bit ถ่าน
user3528438

4
มากกว่าassert()(ถ้านั่นคือสิ่งที่คุณหมายถึง) ฉันจะใช้#if CHAR_BIT != 8... #error "I require CHAR_BIT == 8"...#endif
Keith Thompson

1
@ KeithThompson มีเหตุผลstatic_assert()อะไรไหมที่จะไม่ใช้?
Qix - MONICA ถูกยกเลิก

37

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

มันไม่มากนักที่จะ "ให้ความสำคัญกับการพิจารณา" กับสิ่งที่เล่นตามกฎ ใน C ++ ตัวอย่างเช่นมาตรฐานบอกว่าทุกไบต์จะมี "อย่างน้อย" 8 บิต หากรหัสของคุณสมมติว่าไบต์มีจำนวน 8 บิตอย่างแน่นอนแสดงว่าคุณละเมิดมาตรฐาน

ตอนนี้อาจดูงี่เง่าแล้ว - " แน่นอนว่าทุกไบต์มี 8 บิต!" ฉันได้ยินคุณพูด แต่คนฉลาด ๆ จำนวนมากพึ่งพาสมมติฐานที่ไม่รับประกันแล้วทุกอย่างก็พัง ประวัติเต็มไปด้วยตัวอย่างเช่น

ตัวอย่างเช่นนักพัฒนาช่วงต้นทศวรรษที่ 90 ส่วนใหญ่สันนิษฐานว่าการหน่วงเวลา CPU แบบไม่ใช้งานโดยเฉพาะการใช้จำนวนรอบคงที่จะใช้เวลาจำนวนคงที่เนื่องจากซีพียูผู้บริโภคส่วนใหญ่มีพลังงานเทียบเท่ากัน น่าเสียดายที่คอมพิวเตอร์เร็วขึ้นอย่างรวดเร็วมาก สิ่งนี้ทำให้เกิดกล่องเพิ่มขึ้นด้วยปุ่ม "เทอร์โบ" ซึ่งมีจุดประสงค์อย่างน่าขันคือการทำให้คอมพิวเตอร์ทำงานช้าลงเพื่อให้เกมที่ใช้เทคนิคการหน่วงเวลาสามารถเล่นด้วยความเร็วที่เหมาะสม


ผู้วิจารณ์คนหนึ่งถามว่าที่ไหนในมาตรฐานมันบอกว่าถ่านต้องมีอย่างน้อย 8 บิต มันอยู่ในส่วน5.2.4.2.1 ส่วนนี้กำหนดCHAR_BITจำนวนบิตในเอนทิตีที่สามารถกำหนดแอดเดรสได้น้อยที่สุดและมีค่าเริ่มต้นที่ 8 นอกจากนี้ยังกล่าวว่า:

ค่าที่กำหนดโดยการนำไปปฏิบัติจะต้องมีขนาดเท่ากันหรือมากกว่า (ค่าสัมบูรณ์) ตามที่แสดงพร้อมเครื่องหมายเดียวกัน

ดังนั้นหมายเลขใด ๆ เท่ากับ 8 CHAR_BITหรือสูงกว่าเหมาะสำหรับการทดแทนโดยการดำเนินการออกเป็น


6
ฉันไม่ได้เห็นปุ่มเทอร์โบในเวลาอย่างน้อย 20 ปีคุณคิดว่ามันดีจริงหรือเปล่า?
Mark Ransom

29
@ Mark Ransom: นั่นคือจุดทั้งหมด นักพัฒนามักพึ่งพาสมมติฐานที่ดูเหมือนจะเป็นจริงในขณะนี้ แต่มีความแตกต่างมากกว่าที่พวกเขาปรากฏในตอนแรก (ไม่สามารถนับจำนวนครั้งที่ผมเคยทำที่ผิดพลาด!) ปุ่ม Turbo ควรจะเตือนความทรงจำที่เจ็บปวดไม่ได้ที่จะทำให้สมมติฐานที่ไม่จำเป็นและไม่แน่นอนที่จะทำให้สมมติฐานที่ไม่ได้รับการประกันโดยมาตรฐานภาษาราวกับว่าพวกเขา ข้อเท็จจริงไม่เปลี่ยนรูป
John Feminella

1
คุณช่วยชี้ให้เห็นใน C ++ Standard ซึ่งบอกว่า bye มีอย่างน้อย 8 บิต? เป็นความเชื่อทั่วไป แต่ฉันเองไม่พบมันในมาตรฐาน สิ่งเดียวที่ฉันพบใน Standard คืออักขระที่ต้องสามารถแทนได้โดยcharมีมากกว่า 64 ตัวอักษรแต่น้อยกว่านั้นที่ 128 ดังนั้น 7 บิตจะเพียงพอ
Adam Badura

6
ส่วนที่ 18.2.2 เรียกใช้มาตรฐาน C สำหรับมัน ในมาตรฐาน C คือส่วน 7.10 และจากนั้นส่วน 5.4.2.4.1 หน้า 22 ในมาตรฐาน C
โปรแกรมเมอร์ Windows

2
ดังนั้นคำตอบและข้อคิดเห็นอื่น ๆ ที่กล่าวถึงเครื่องจักรที่มี 5 บิต, 6 บิตและ 7 บิตไบต์ หมายความว่าคุณไม่สามารถเรียกใช้โปรแกรม C บนเครื่องที่สอดคล้องกับมาตรฐานหรือไม่
Jerry Jeremiah

34

เครื่องที่มีสถาปัตยกรรมแบบ 36 บิตมีขนาด 9 บิต ตามวิกิพีเดียเครื่องจักรที่มีสถาปัตยกรรม 36 บิตประกอบด้วย:

  • Corporation อุปกรณ์ดิจิตอล PDP-6/10
  • IBM 701/704/709/7090/7094
  • UNIVAC 1103 / 1103A / 1105/1100/2200

7
นอกจากนี้เครื่องจักรของ Honeywell เช่นอาจเป็นเครื่องจักรที่สองที่มีการนำ C มาใช้ ดู K&R เวอร์ชั่น 1
โปรแกรมเมอร์ของ Windows

5
ที่จริง ธ.ค. 10 ก็ยังได้มีตัวละคร 6 บิต - คุณสามารถแพ็ค 6 ของเหล่านี้เป็นคำ 36 บิต (อดีต ธ.ค. 10 โปรแกรมเมอร์พูด)

2
DEC-20 ใช้อักขระ ASCII 7 บิตห้าตัวต่อคำ 36 บิตบน TOPS-20 O / S
David R Tribble

3
เรื่องตลกนั้นถูกนำไปใช้จริงสำหรับการสนับสนุน Unicode ในสถาปัตยกรรมนี้
Joshua

9
ฉันคิดว่าเหตุผลที่เคยใช้ฐานแปดนั้นเป็นเพราะเลขฐานแปด 3 ตัวแทนไบต์ 9 บิตอย่างเรียบร้อยเหมือนกับที่เรามักจะใช้เลขฐานสิบหกวันนี้เพราะเลขฐานสิบหกสองตัวแทน 8 บิตอย่างเรียบร้อย
bames53

18

ที่ฉันรู้บาง:

  • ธ.ค. PDP-10: ตัวแปร แต่ส่วนใหญ่มักจะเป็นตัวอักษร 7 บิตบรรจุ 5 ต่อคำ 36 บิตหรืออื่น ๆ 9 บิตตัวอักษร 4 ต่อคำ
  • เมนเฟรมข้อมูลควบคุม (CDC-6400, 6500, 6600, 7600, Cyber ​​170, Cyber ​​176 ฯลฯ ) ตัวอักษรขนาด 6 บิตบรรจุ 10 ตัวต่อคำ 60 บิต
  • Unisys mainframes: 9 bits / byte
  • Windows CE: ไม่รองรับประเภท `char` เลย - ต้องใช้ wchar_t 16 บิตแทน

2
@ephemient: ฉันค่อนข้างแน่ใจว่ามีคอมไพเลอร์ C อย่างน้อยหนึ่งมาตรฐานสำหรับ PDP-10 / DecSystem 10 / DecSystem 20 ฉันจะแปลกใจมากที่คอมไพเลอร์ C สำหรับเมนเฟรมของ CDC แม้ว่า (พวกเขาคือ ส่วนใหญ่ใช้สำหรับงานที่เป็นตัวเลขดังนั้นคอมไพเลอร์ Fortran จึงเป็นเรื่องใหญ่ที่นั่น) ฉันค่อนข้างมั่นใจว่าคนอื่นมีคอมไพเลอร์ C
Jerry Coffin

3
คอมไพเลอร์ Windows CE ไม่รองรับcharชนิดเลยหรือไม่? ฉันรู้ว่าไลบรารี่ของระบบรองรับเฉพาะฟังก์ชั่น char แบบกว้างที่รับสายและอย่างน้อย WinCE บางรุ่นก็ลบฟังก์ชั่นสตริง ANSI เช่น strlen เพื่อหยุดการจัดการสตริงอักขระ char แต่จริงๆแล้วมันไม่มีถ่านประเภทนี้เลยเหรอ? อะไรคือสิ่งที่sizeof(TCHAR)? malloc ชนิดใดที่ส่งคืน? byteชนิดของJava ถูกนำไปใช้อย่างไร
Steve Jessop

10
Windows CE รองรับถ่านซึ่งเป็นไบต์ ดูความคิดเห็นของ Craig McQueen ต่อคำตอบของ Richard Pennington ไบต์มีความจำเป็นเช่นเดียวกับใน Windows CE เช่นเดียวกับที่อื่นไม่ว่าจะมีขนาดใดก็ตาม
โปรแกรมเมอร์ Windows

2
มีการใช้งาน C อย่างน้อยสองรายการสำหรับ PDP-10: KCC และพอร์ต gcc ( pdp10.nocrew.org/gcc )
AProgrammer

3
มาตรฐาน C จะไม่อนุญาตให้ใช้ตัวอักษรขนาด 7 บิตที่บรรจุ 5 ตัวต่อคำแบบ 36 บิต (ตามที่คุณกล่าวถึงสำหรับ PDP-10) และจะไม่อนุญาตให้ใช้ตัวอักษรแบบ 6 บิตตามที่คุณกล่าวถึงสำหรับเมนเฟรมข้อมูลการควบคุม ดูparashift.com/c++-faq-lite/intrinsic-types.html#faq-26.6
Ken Bloom

15

ไม่มีสิ่งเช่นรหัสพกพาอย่างสมบูรณ์ :-)

ใช่อาจมีขนาดหลายไบต์ / ขนาดถ่าน ใช่อาจจะมี C / C ++ การใช้งานสำหรับแพลตฟอร์มที่มีค่าสูงผิดปกติของและCHAR_BIT UCHAR_MAXใช่บางครั้งมันเป็นไปได้ที่จะเขียนโค้ดที่ไม่ได้ขึ้นอยู่กับขนาดถ่าน

อย่างไรก็ตามรหัสจริงเกือบทั้งหมดไม่ได้เป็นแบบสแตนด์อโลน เช่นคุณอาจกำลังเขียนรหัสที่ส่งข้อความไบนารีไปยังเครือข่าย (โปรโตคอลไม่สำคัญ) คุณอาจกำหนดโครงสร้างที่มีฟิลด์ที่จำเป็น กว่าที่คุณจะต้องทำให้เป็นอันดับ การคัดลอกไบนารีแบบโครงสร้างลงในบัฟเฟอร์เอาต์พุตไม่ใช่แบบพกพา: โดยทั่วไปคุณไม่ทราบว่าคำสั่งไบต์สำหรับแพลตฟอร์มหรือการจัดตำแหน่งสมาชิกโครงสร้างดังนั้นโครงสร้างเพิ่งเก็บข้อมูล แต่ไม่ได้อธิบายวิธีการเรียงลำดับข้อมูล .

ตกลง. คุณสามารถทำการแปลงคำสั่งไบต์และย้ายสมาชิกโครงสร้าง (เช่นuint32_tหรือคล้ายกัน) โดยใช้memcpyลงในบัฟเฟอร์ ทำไมmemcpy? เนื่องจากมีแพลตฟอร์มจำนวนมากที่ไม่สามารถเขียนแบบ 32 บิต (16- บิต, 64- บิต - ไม่แตกต่างกัน) เมื่อที่อยู่เป้าหมายไม่ได้รับการจัดตำแหน่งอย่างเหมาะสม

ดังนั้นคุณได้ทำไปแล้วหลายอย่างเพื่อให้สามารถพกพาได้

และตอนนี้คำถามสุดท้าย เรามีบัฟเฟอร์ ข้อมูลจากมันถูกส่งไปยังเครือข่าย TCP / IP เครือข่ายดังกล่าวถือว่า 8 บิต คำถามคือบัฟเฟอร์ประเภทใดควรเป็นอย่างไร ถ้าตัวอักษรของคุณเป็น 9 บิต? ถ้าเป็น 16 บิต 24? บางทีถ่านแต่ละตัวนั้นตรงกับหนึ่งไบต์ 8 บิตที่ส่งไปยังเครือข่ายและใช้เพียง 8 บิตเท่านั้น หรืออาจมีหลายไบต์เครือข่ายที่บรรจุในตัวอักษรขนาด 24/16/9 บิต? นั่นเป็นคำถามและยากที่จะเชื่อว่ามีคำตอบเดียวที่เหมาะกับทุกกรณี หลายสิ่งขึ้นอยู่กับการใช้ซ็อกเก็ตสำหรับแพลตฟอร์มเป้าหมาย

ดังนั้นสิ่งที่ฉันพูดถึง โดยปกติแล้วรหัสอาจทำแบบพกพาได้ง่ายในระดับหนึ่ง มันสำคัญมากที่จะทำเช่นนั้นหากคุณคาดว่าจะใช้รหัสบนแพลตฟอร์มที่ต่างกัน อย่างไรก็ตามการปรับปรุงความสะดวกในการพกพานอกเหนือจากการวัดนั้นเป็นสิ่งที่ต้องใช้ความพยายามอย่างมากและมักให้ผลน้อยเนื่องจากรหัสจริงมักขึ้นอยู่กับรหัสอื่น ๆ (การติดตั้งซ็อกเก็ตในตัวอย่างด้านบน) ฉันมั่นใจว่าประมาณ 90% ของความสามารถด้านรหัสในการทำงานบนแพลตฟอร์มที่มีไบต์อื่นที่ไม่ใช่ 8 บิตนั้นแทบจะไร้ประโยชน์เพราะมันใช้สภาพแวดล้อมที่เชื่อมโยงกับ 8 บิต เพียงตรวจสอบขนาดไบต์และทำการยืนยันเวลาการคอมไพล์ คุณเกือบจะต้องเขียนซ้ำมากสำหรับแพลตฟอร์มที่ผิดปกติอย่างมาก

แต่ถ้ารหัสของคุณเป็น "แบบสแตนด์อโลน" อย่างสูง - ทำไมล่ะ คุณอาจเขียนด้วยวิธีที่อนุญาตให้มีขนาดไบต์ที่แตกต่างกัน


4
หากหนึ่งเก็บหนึ่ง octet ต่อunsigned charค่าไม่ควรมีปัญหาการพกพาเว้นแต่รหัสจะใช้เทคนิคนามแฝงแทนการเลื่อนเพื่อแปลงลำดับของ octet เป็น / จากประเภทจำนวนเต็มขนาดใหญ่ โดยส่วนตัวแล้วฉันคิดว่ามาตรฐาน C ควรกำหนดอินทรินติกส์ในการแพ็ค / คลายจำนวนเต็มจากลำดับของประเภทที่สั้นกว่า (โดยทั่วไปแล้วchar) จัดเก็บจำนวนบิตต่อชิ้น (8 ต่อunsigned char16 unsigned shortหรือ 32 ต่อunsigned long)
supercat



5

ตัวอย่างเช่นภาษาการเขียนโปรแกรม C และ C ++ กำหนดไบต์เป็น "หน่วยแอดเดรสของข้อมูลที่มีขนาดใหญ่พอที่จะเก็บสมาชิกของชุดอักขระพื้นฐานของสภาพแวดล้อมการดำเนินการ" (ข้อ 3.6 ของมาตรฐาน C) เนื่องจากชนิดข้อมูลที่รวม C char ต้องมีอย่างน้อย 8 บิต (ข้อ 5.2.4.2.1) ไบต์ใน C อย่างน้อยจึงสามารถเก็บค่าได้ 256 ค่า การใช้งานที่หลากหลายของ C และ C ++ กำหนดไบต์เป็น 8, 9, 16, 32 หรือ 36 บิต

อ้างถึงจากhttp://en.wikipedia.org/wiki/Byte#History

ไม่แน่ใจเกี่ยวกับภาษาอื่น ๆ

http://en.wikipedia.org/wiki/IBM_7030_Stretch#Data_Formats

กำหนดไบต์บนเครื่องนั้นให้เป็นความยาวผันแปรได้


1
"ไม่แน่ใจเกี่ยวกับภาษาอื่น ๆ " - ในอดีตภาษาส่วนใหญ่อนุญาตให้สถาปัตยกรรมของเครื่องกำหนดขนาดไบต์ของตัวเอง ที่จริงแล้วในอดีต C ทำเช่นนั้นจนกระทั่งมาตรฐานกำหนดขอบเขตที่ต่ำกว่าที่ 8
โปรแกรมเมอร์ Windows

4

ครอบครัว DEC PDP-8 มีคำศัพท์ 12 บิตแม้ว่าคุณมักจะใช้ 8 บิต ASCII สำหรับเอาท์พุท (บน Teletype ส่วนใหญ่) อย่างไรก็ตามยังมีรหัสอักขระ 6 บิตที่อนุญาตให้คุณเข้ารหัส 2 ตัวอักษรในคำ 12 บิตเดียว


3

สำหรับหนึ่งอักขระ Unicode มีความยาวมากกว่า 8 บิต ดังที่มีคนพูดถึงก่อนหน้านี้ข้อมูลจำเพาะ C กำหนดประเภทข้อมูลตามขนาดขั้นต่ำของพวกเขา ใช้sizeofและค่าในlimits.hหากคุณต้องการสอบถามประเภทข้อมูลของคุณและค้นพบขนาดที่เหมาะสมสำหรับการกำหนดค่าและสถาปัตยกรรมของคุณ

ด้วยเหตุนี้ฉันจึงพยายามยึดติดกับชนิดข้อมูลเช่นuint16_tเมื่อฉันต้องการชนิดข้อมูลที่มีความยาวบิตเฉพาะ

แก้ไข:ขออภัยฉันเริ่มอ่านคำถามของคุณผิด

ข้อมูลจำเพาะ C บอกว่าcharวัตถุมีขนาด "ใหญ่พอที่จะเก็บสมาชิกของชุดอักขระการดำเนินการ" limits.hแสดงรายการขนาดต่ำสุด 8 บิต แต่คำจำกัดความเป็นขนาดสูงสุดของการcharเปิด

ดังนั้น a charอย่างน้อยตราบใดที่อักขระที่ใหญ่ที่สุดจากชุดการดำเนินการของสถาปัตยกรรมของคุณ (โดยทั่วไปจะปัดเศษขึ้นเป็นขอบเขต 8 บิตที่ใกล้ที่สุด) หากสถาปัตย์ของคุณมีรหัสที่ยาวกว่าcharขนาดของคุณอาจจะยาวกว่า

ในอดีต opcode ของแพลตฟอร์ม x86 มีความยาวหนึ่งไบต์ดังนั้นcharในตอนแรกจึงมีค่า 8 บิต แพลตฟอร์ม x86 ปัจจุบันสนับสนุน opcode ที่ยาวกว่าหนึ่งไบต์ แต่charจะถูกเก็บไว้ที่ความยาว 8 บิตเนื่องจากเป็นสิ่งที่โปรแกรมเมอร์ (และปริมาณมากของรหัส x86 ที่มีอยู่) ถูกกำหนดให้เป็น

stdint.hเมื่อความคิดเกี่ยวกับการสนับสนุนหลายแพลตฟอร์มใช้ประโยชน์จากประเภทที่กำหนดไว้ใน ถ้าคุณใช้ (เช่นบริการ) uint16_t แล้วคุณสามารถมั่นใจได้ว่าค่านี้เป็นค่าไม่ได้ลงนาม 16 บิตบนสถาปัตยกรรมสิ่งที่ไม่ว่าจะสอดคล้องกับค่า 16 บิตไปchar, short, intหรือสิ่งอื่น การทำงานหนักส่วนใหญ่ทำโดยผู้เขียนคอมไพเลอร์ / ไลบรารีมาตรฐานของคุณ

หากคุณจำเป็นต้องรู้ขนาดที่แน่นอนของcharเพราะคุณกำลังทำการจัดการฮาร์ดแวร์ระดับต่ำที่ต้องการฉันมักจะใช้ประเภทข้อมูลที่มีขนาดใหญ่พอที่จะcharรองรับแพลตฟอร์มที่รองรับทั้งหมด (โดยปกติคือ 16 บิตก็เพียงพอแล้ว) และเรียกใช้ ค่าผ่านconvert_to_machine_charรูทีนเมื่อฉันต้องการการแทนค่าเครื่องที่แน่นอน uint16_tวิธีการที่แพลตฟอร์มรหัสเฉพาะถูกกักขังอยู่ในฟังก์ชั่นอินเตอร์เฟซและส่วนใหญ่ของเวลาที่ฉันสามารถใช้ปกติ


2
คำถามไม่ได้ถามถึงตัวละคร (ไม่ว่าจะเป็น Unicode หรือไม่ก็ตาม) มันถามเรื่องถ่านซึ่งเป็นไบต์
โปรแกรมเมอร์ Windows

1
นอกจากนี้ชุดอักขระการดำเนินการไม่มีส่วนเกี่ยวข้องกับ opcodes เป็นชุดอักขระที่ใช้ในการดำเนินการคิดว่าเป็นตัวรวบรวมข้าม
ninjalj

"อดีต opcode ของแพลตฟอร์ม x86 มีความยาวหนึ่งไบต์": น่ารักมาก ในอดีต C ได้รับการพัฒนาบน PDP-11 (1972) นานก่อนที่จะมีการคิดค้น x86 (1978)
Martin Bonner สนับสนุน Monica

3

สิ่งที่ควรคำนึงถึงในการพิจารณาให้กับแพลตฟอร์มที่ไม่ใช่ถ่าน 8 บิต

จำนวนเวทมนตร์เกิดขึ้นเช่นเมื่อขยับ;

ส่วนใหญ่สามารถจัดการได้ง่ายๆโดยใช้ CHAR_BIT และเช่น UCHAR_MAX แทน 8 และ 255 (หรือคล้ายกัน)

หวังว่าการติดตั้งของคุณจะเป็นตัวกำหนด :)

เหล่านี้คือปัญหา "ทั่วไป" .....

ปัญหาทางอ้อมอีกอย่างหนึ่งก็คือคุณมี:

struct xyz {
   uchar baz;
   uchar blah;
   uchar buzz; 
}

สิ่งนี้อาจใช้ "เพียง" (กรณีที่ดีที่สุด) 24 บิตบนแพลตฟอร์มเดียว แต่อาจใช้เวลาเช่น 72 บิตที่อื่น .....

หาก uchar แต่ละคนถือ "ธงบิต" และ uchar แต่ละคนมีบิตหรือธงที่มีนัยสำคัญ "2" ที่คุณใช้อยู่และคุณจัดระเบียบพวกเขาเป็น 3 uchars สำหรับ "ชัดเจน" ดังนั้นมันอาจจะค่อนข้าง "เสียมากกว่า" เช่นใน แพลตฟอร์มที่มี uchars 24 บิต .....

ไม่มีอะไร bitfields ไม่สามารถแก้ไขได้ แต่พวกเขามีสิ่งอื่น ๆ ที่ต้องระวัง ....

ในกรณีนี้เพียงแค่ enum เพียงอันเดียวอาจเป็นวิธีที่จะได้จำนวนเต็มที่น้อยที่สุดที่คุณต้องการ ....

อาจไม่ใช่ตัวอย่างจริง แต่สิ่งนี้ "บิต" ฉันเมื่อย้าย / เล่นด้วยรหัสบางอย่าง .....

ความจริงที่ว่าถ้า uchar นั้นใหญ่กว่าสามเท่าที่คาดไว้ "ปกติ" 100 โครงสร้างดังกล่าวอาจเสียหน่วยความจำจำนวนมากในบางแพลตฟอร์ม ..... ที่ "ปกติ" ไม่ใช่เรื่องใหญ่ .... .

ดังนั้นสิ่งต่าง ๆ ยังสามารถ "เสีย" หรือในกรณีนี้ "เสียหน่วยความจำจำนวนมากอย่างรวดเร็ว" เนื่องจากข้อสันนิษฐานว่า uchar คือ "ไม่สิ้นเปลือง" ในแพลตฟอร์มหนึ่งเทียบกับ RAM ที่มีอยู่มากกว่าบนแพลตฟอร์มอื่น ... ..

ปัญหาอาจเด่นกว่าเช่นสำหรับ ints เช่นกันหรือชนิดอื่น ๆ เช่นคุณมีโครงสร้างบางอย่างที่ต้องการ 15 บิตดังนั้นคุณจึงติดอยู่ใน int แต่บนแพลตฟอร์มอื่น ๆ บางแห่ง int คือ 48 บิตหรืออะไรก็ตาม ... .

"ปกติ" คุณอาจแบ่งออกเป็น 2 uchars แต่เช่นด้วย uchar แบบ 24 บิตคุณต้องใช้เพียง .....

ดังนั้น enum อาจเป็นทางออกที่ดีกว่า "ทั่วไป" ....

ขึ้นอยู่กับว่าคุณเข้าถึงบิตเหล่านั้นอย่างไร :)

ดังนั้นอาจมี "ข้อบกพร่องการออกแบบ" ที่อยู่ด้านหลังศีรษะของพวกเขา .... แม้ว่ารหัสอาจยังทำงาน / ทำงานได้ดีโดยไม่คำนึงถึงขนาดของ uchar หรือ uint ...

มีบางอย่างที่ต้องระวังแม้ว่าจะไม่มี "หมายเลขเวทมนตร์" ในรหัสของคุณ ...

หวังว่ามันจะสมเหตุสมผล :)


1
...อะไร? ทำไมคุณคิดว่าenumน่าจะมีขนาดเล็กกว่าชนพื้นเมืองประเภทอื่น ๆ คุณทราบintหรือไม่ว่าเป็นค่าเริ่มต้นสำหรับที่เก็บข้อมูลเดียวกันกับ "คุณมีโครงสร้างบางอย่างที่ต้องการ 15 บิตดังนั้นคุณจึงติดไว้ใน int แต่บนแพลตฟอร์มอื่น ๆ บางอย่าง int คือ 48 บิตหรืออะไรก็ตาม ..... " - #include <cstdint>และทำให้เป็นint16_tโอกาสที่ดีที่สุดในการลดการใช้บิต . ฉันไม่แน่ใจจริงๆว่าสิ่งที่คุณคิดว่าคุณพูดในรูปวงรีเหล่านั้น
underscore_d

1

int เคยเป็น 16 บิต (pdp11 เป็นต้น) การไปที่สถาปัตยกรรม 32 บิตนั้นยาก ผู้คนเริ่มดีขึ้น: แทบไม่มีใครคิดว่าตัวชี้จะพอดีกับอีกต่อไปอีกต่อไป หรือไฟล์ออฟเซ็ตหรือเวลาบันทึกหรือ ...

อักขระ 8 บิตมีความผิดปกติอยู่แล้ว เราต้องการ 32 บิตเพื่อเก็บชุดตัวละครทั้งหมดของโลก


2
จริง ชื่อcharนี้ค่อนข้างแปลกตาในวัน Unicode ฉันสนใจเพิ่มเติมเกี่ยวกับหน่วย 8 บิต (octet) เมื่อจัดการกับข้อมูลไบนารีเช่นที่เก็บไฟล์การสื่อสารเครือข่าย uint8_tมีประโยชน์มากขึ้น
Craig McQueen

3
Unicode ไม่ต้องการบิตเต็ม 32 อันที่จริงแล้ว พวกเขาวางแผนที่เดิมในวันที่ 31 (ดูต้นฉบับ UTF-8 ที่ทำงาน) แต่ตอนนี้พวกเขากำลังเนื้อหาที่มีเพียง 21 บิต พวกเขาอาจรู้ว่าพวกเขาจะไม่สามารถพิมพ์หนังสือได้อีกต่อไปหากต้องการ 31 บิตทั้งหมด: P
me22

2
@ me22, Unicode เดิมวางแผนไว้สำหรับ 16 บิต "อักขระ Unicode มีความกว้างอย่างสม่ำเสมอ 16 บิตโดยไม่คำนึงถึงภาษา ... " Unicode 1.0.0 unicode.org/versions/Unicode1.0.0/ch01.pdf
แชนนอนชดเชย

1
ISO 10646 เดิมเป็นบิต 31 บิตและ Unicode ผสานกับ ISO 10646 ดังนั้นจึงอาจเลอะเทอะหากกล่าวว่า Unicode เป็น 31 บิต แต่ก็ไม่จริง โปรดทราบว่าพวกเขาจะไม่พิมพ์ตารางรหัสแบบเต็มอีกต่อไป
prosfilaes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.