ทำไมตัวเลขฐานสิบหกเป็นคำนำหน้า0x
? ฉันเข้าใจการใช้คำนำหน้า แต่ฉันไม่เข้าใจความสำคัญของสาเหตุที่0x
เลือก
ทำไมตัวเลขฐานสิบหกเป็นคำนำหน้า0x
? ฉันเข้าใจการใช้คำนำหน้า แต่ฉันไม่เข้าใจความสำคัญของสาเหตุที่0x
เลือก
คำตอบ:
เรื่องสั้น: The 0
บอก parser ว่ามันเกี่ยวข้องกับค่าคงที่ ยังคงมีบางสิ่งที่จำเป็นต้องระบุฐานจำนวน: x
ตัวเลือกนี้เป็นตัวเลือก
เรื่องยาว:ในยุค 60 ระบบหมายเลขการเขียนโปรแกรมที่แพร่หลายเป็นทศนิยมและฐานแปด - เมนเฟรมมี 12, 24 หรือ 36 บิตต่อไบต์ซึ่งสามารถหารได้อย่างสวยงามโดย 3 = log2 (8)
ภาษา BCPL ใช้ไวยากรณ์8 1234
สำหรับตัวเลขฐานแปด เมื่อ Ken Thompson สร้าง B จาก BCPL เขาใช้0
คำนำหน้าแทน อันนี้ยอดเยี่ยมเพราะ
0
เหมือนกันทั้งสองฐาน)00005 == 05
) และ#123
)เมื่อ C ถูกสร้างขึ้นจาก B ความต้องการเลขฐานสิบหกก็เกิดขึ้น (PDP-11 มีคำ 16 บิต) และคะแนนทั้งหมดข้างต้นยังคงใช้ได้ ตั้งแต่ octals ก็ยังคงจำเป็นสำหรับเครื่องอื่น ๆ0x
ได้รับการแต่งตั้งโดยพล ( 00
อาจจะถูกตัดออกเป็นที่น่าอึดอัดใจ)
C # เป็นผู้สืบทอดของ C ดังนั้นมันจึงสืบทอดไวยากรณ์
0x
มากกว่า00
นั้นคือความชอบ / ความอึดอัดใจ 00
จะทำลายรหัสที่มีอยู่ 0010
เป็นฐานแปดคือ8
ในขณะที่0010
เป็น hexidecimal 16
จะเป็น พวกเขาไม่สามารถใช้ตัวเลขใด ๆ เป็นตัวบ่งชี้ตัวเลขหลักที่สอง (ยกเว้น8
หรือ9
และไม่มีความสำคัญใด ๆ ที่เกี่ยวข้องกับเลขฐานสิบหก) ดังนั้นจึงต้องมีจดหมาย และนั่นก็ทิ้งไว้0h
หรือ0x
( h e X idecimal) จากจุดนี้ดูเหมือนว่าจะกลับไปที่การตั้งค่าอย่างแท้จริง
0
คำนำหน้าสำหรับเลขฐานแปดทำให้เกิดปัญหามากมายในช่วงหลายปีที่ผ่านมา 0
โดยเฉพาะอย่างยิ่งในประเทศเช่นสหราชอาณาจักรที่หมายเลขโทรศัพท์เริ่มต้นด้วย Javascript และภาษาอื่น ๆ จะแยกวิเคราะห์สิ่งเหล่านี้เป็นฐานแปด, mangling หมายเลขก่อนที่จะจัดเก็บ เพื่อเพิ่มความสนุกสนานผลิตภัณฑ์ฐานข้อมูลหนึ่งที่เป็นที่นิยมจะเงียบสลับกลับไปแยกทศนิยมถ้าจำนวนที่มีอยู่หรือ8
9
หมายเหตุ: ฉันไม่ทราบคำตอบที่ถูกต้อง แต่ด้านล่างเป็นเพียงการเก็งกำไรส่วนตัวของฉัน!
ตามที่ได้รับการกล่าวถึง 0 ก่อนจำนวนหมายความว่ามันเป็นเลขฐานแปด:
04524 // octal, leading 0
ลองนึกภาพว่าจำเป็นต้องมีระบบเพื่อแสดงตัวเลขฐานสิบหกและสังเกตว่าเรากำลังทำงานในสภาพแวดล้อมสไตล์ C วิธีจบด้วย h เช่นการประกอบ? น่าเสียดายที่คุณทำไม่ได้ - มันจะช่วยให้คุณทำโทเค็นซึ่งเป็นตัวระบุที่ถูกต้อง (เช่นคุณสามารถตั้งชื่อตัวแปรแบบเดียวกัน) ซึ่งจะทำให้เกิดความกำกวมที่น่ารังเกียจ
8000h // hex
FF00h // oops - valid identifier! Hex or a variable or type named FF00h?
คุณไม่สามารถนำตัวละครด้วยเหตุผลเดียวกัน:
xFF00 // also valid identifier
การใช้แฮชอาจถูกโยนออกไปเพราะขัดแย้งกับตัวประมวลผลล่วงหน้า:
#define ...
#FF00 // invalid preprocessor token?
ในท้ายที่สุดไม่ว่าจะด้วยเหตุผลใดพวกเขาตัดสินใจที่จะวาง x หลังค่านำ 0 เพื่อแสดงเลขฐานสิบหก มันไม่คลุมเครือเนื่องจากมันยังคงขึ้นต้นด้วยตัวอักษรตัวเลขดังนั้นจึงไม่สามารถเป็นตัวระบุที่ถูกต้องและอาจเป็นไปตามอนุสัญญาฐานแปดของ 0 นำหน้า
0xFF00 // definitely not an identifier!
0xFFAB1234
0FFAB1234h
ฉันจำได้จาก inline asm ใน Pascal เมื่อฉันเป็นstackoverflow.com/q/11733731/995714
มันเป็นคำนำหน้าเพื่อระบุจำนวนที่เป็นเลขฐานสิบหกมากกว่าในฐานอื่น ๆ ภาษาการเขียนโปรแกรม C ใช้เพื่อบอกคอมไพเลอร์
ตัวอย่าง:
0x6400
แปลว่า 6*16^3 + 4*16^2 + 0*16^1 +0*16^0 = 25600.
เมื่อคอมไพเลอร์อ่าน0x6400
มันเข้าใจว่าจำนวนเป็นเลขฐานสิบหกด้วยความช่วยเหลือของ คำ0x โดยปกติเราสามารถเข้าใจโดย (6400) 16หรือ (6400) 8หรืออะไรก็ได้ ..
สำหรับไบนารีมันจะเป็น:
0b00000001
หวังว่าฉันได้ช่วยในทางใดทางหนึ่ง
ขอให้เป็นวันที่ดี!
x6400
? x
ยังสามารถนำมาใช้เพื่อสรุปเลขฐานสิบหก
0 ก่อนหน้านี้ใช้เพื่อระบุตัวเลขในฐาน 2, 8, หรือ 16
ในความคิดของฉัน 0x ได้รับเลือกให้ระบุเลขฐานสิบหกเพราะ 'x' ดูเหมือนเป็นเลขฐานสิบหก
แค่ความเห็นของฉัน แต่ฉันคิดว่ามันสมเหตุสมผล
ขอให้เป็นวันที่ดี!