การบวกเลขฐานสองและจำนวนเต็มที่มีเครื่องหมาย
แนะนำใหม่| English | ความหมาย |
|---|---|
| overflow/ˌəʊvəˈfləʊ/ | การล้น |
| two's complement/tuːz ˈkɒmplɪmənt/ | คอมพลีเมนต์สอง |
| register/ˈredʒɪstə/ | รีจิสเตอร์ |
| sign bit/saɪn bɪt/ | บิตเครื่องหมาย |
| most significant bit/məʊst sɪɡˈnɪfɪkənt bɪt/ | บิตที่มีนัยสำคัญสูงสุด |
| one's complement/wʌnz ˈkɒmplɪmənt/ | คอมพลีเมนต์หนึ่ง |
| Binary Coded Decimal/ˈbaɪnəri ˈkəʊdɪd ˈdesɪml/ | ทศนิยมเข้ารหัสแบบไบนารี |
ธนาคารที่สูญเสียวันหนึ่ง
- ในวันที่ 1 กันยายน ค.ศ. 1983 ดัชนีตลาดหุ้นVANCOUVER อยู่ที่ระดับ 524.811 ดัชนีนี้ได้เปิดทำการที่ระดับ 1000 ก่อนหน้า 22 เดือน และตลาดได้ปรับตัวสูงขึ้นตลอดช่วงเวลานั้น
- โปรแกรมคำนวณดัชนีใหม่ทุกครั้งหลังการซื้อขายแต่ละรายการ โดยตัดทอนทศนิยมแทนการปัดเศษ ทุกครั้งที่ตัดทอนจะเสียส่วนทศนิยมไปเล็กน้อย การซื้อขายสามพันรายการต่อวันทำให้ผลรวมลดลงจนเหลือเพียงค่าที่ผิดเพี้ยน
- เมื่อคำนวณใหม่อย่างถูกต้อง ดัชนีอยู่ที่ 1098.892: คือการคำนวณทางคณิตศาสตร์ ไม่ใช่ตลาด ที่ทำให้ค่าลดลงครึ่งหนึ่ง
- การคำนวณด้วยจำนวนบิตที่กำหนดไว้ ไม่เหมือนการคำนวณที่คุณเคยเรียนในโรงเรียน บทเรียนนี้ครอบคลุมการบวกเลขฐานสอง, การล้น, การลบด้วยวิธี สองส่วนเสริม, จำนวนเต็มที่มีเครื่องหมาย, และ BCD
การบวกเลขฐานสอง
- บวกหลักต่อหลักจากขวาไปซ้าย ย้ายตัวเข้าหลักถัดไป เหมือนกับการบวกเลขฐานสิบทุกประการ
- กฎการบวก: $0 + 0 = 0$; $0 + 1 = 1$; $1 + 1 = 10$ เขียน 0 และย้ายตัวเข้า 1; $1 + 1 + 1 = 11$ เขียน 1 และย้ายตัวเข้า 1
0101$+$0011$=$1000นั่นคือ $5 + 3 = 8$

ใช้วิธีการเดียวกับเลขฐานสิบ แต่มีเพียงสองหลักที่ต้องย้ายตัวเข้า
เลขฐานสอง & จำนวนเต็มที่มีเครื่องหมาย
byte = ผลรวมของค่าตำแหน่ง
ดูว่ารูปแบบ 8 บิตจับคู่กับตัวเลขอย่างไร (และ会发生溢出เกิน 255 อย่างไร)
บวกเลขฐานสอง 0101 + 0011 ให้ผลลัพธ์เป็น 4 บิต
Difficulty 1/5 · 100 coins + a small bonus on first completion today
$5 + 3 = 8$ ซึ่งคือ 1000 ในเลขฐานสอง
การล้น (Overflow)
- การล้น เกิดขึ้นเมื่อผลลัพธ์ของการคำนวณต้องการบิตมากกว่าที่ รีจิสเตอร์ จะรองรับได้ ตัวเข้าที่ลอยออกจากหลักที่มีค่าน้ำหนักมากที่สุดจะถูกทิ้งไป ทำให้คำตอบที่บันทึกไว้ผิดพลาด
- นี่เป็นคุณสมบัติของ ความกว้างของรีจิสเตอร์ ไม่ใช่ของตัวเลข 255: ในรีจิสเตอร์ขนาด 16 บิต ผลรวมเดียวกันนี้จะถูกต้อง
- ในการคำนวณด้วยจำนวนเต็มที่มีเครื่องหมาย สัญญาณเตือนคือบิตเครื่องหมายที่เปลี่ยนสถานะผิด: บวกเลขบวกสองตัวแล้วได้ลบ, หรือลบกับลบแล้วได้บวก
Overflow ในการบวกเลขฐานสองหมายถึง:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Overflow เกิดขึ้นเมื่อผลรวมมีขนาดใหญ่เกินกว่าจะใส่ลงในบิตที่มีอยู่ การ carry ออกจากคอลัมน์ทางซ้ายสุดจะหายไป
ตัวอย่างแสดงวิธีทำ: ตั้งชื่อการล้นให้ถูกต้อง
- บวกจำนวนเต็มไม่มีเครื่องหมาย 8 บิต
10110101และ01101100แล้วอธิบายผลลัพธ์ที่ได้ - ผลรวมคือ
1 0010 0001ซึ่งต้องใช้ถึง 9 บิต ผลลัพธ์ที่แท้จริงคือ 289 - คำตอบที่สมบูรณ์: เกิดการล้น เพราะ 289 มีค่ามากกว่าค่าสูงสุดที่รีจิสเตอร์ 8 บิตจะรองรับได้ ซึ่งคือ 255; ตัวเข้าที่ลอยออกจากบิตที่มีค่าน้ำหนักมากที่สุดถูกทิ้งไป ทำให้ผลลัพธ์ที่บันทึกไว้คือ
0010 0001ซึ่งมีค่าจริงเท่ากับ 33 จึงเป็นค่าที่ผิด - คะแนนจะพิจารณาจากการระบุ ความกว้างของรีจิสเตอร์ และการระบุว่าผลลัพธ์ไม่สามารถแสดงได้ในระบบนั้น คำว่า "คำตอบมีค่ามากกว่า 255" เพียงอย่างเดียวจะไม่ได้รับคะแนน
บวกจำนวนเต็มที่ไม่ติดลบขนาด 8 บิตเข้าด้วยกันแล้วผลลัพธ์ต้องการ 9 บิต คำอธิบายที่ได้คะแนนเต็มคืออะไร?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
ระบุความกว้างของเรจสเตอร์ บอกว่าผลลัพธ์ไม่สามารถแทนค่าได้ด้วย และบอก发生了什么กับcarry ตัวเลือกอื่น ๆ บอกเพียงอาการโดยไม่ระบุสาเหตุ
การลบด้วยวิธีสองส่วนเสริม
- เพื่อคำนวณ $A - B$: สร้าง สองส่วนเสริม ของ $B$ โดยการกลับค่าบิตทุกตัวและบวก 1 นำไปบวกกับ $A$ จากนั้น ทิ้ง ตัวเข้าสุดท้ายออก
- $100 - 30$ ใน 8 บิต: สองส่วนเสริมของ
0001 1110คือ1110 0001กลับค่าบิตแล้วบวก 1 จะได้1110 0010 0110 0100$+$1110 0010$=$1 0100 0110; ทิ้ง 1 ด้านหน้าออกแล้วอ่าน0100 0110$= 70$. ✓

การลบกลายเป็นการบวก นี่คือเหตุผลที่โปรเซสเซอร์ไม่จำเป็นต้องมีวงจรลบ
ค่าสองส่วนเสริมขนาด 4 บิตของ 0011 คืออะไร? (พลิก แล้วบวก 1)
Difficulty 1/5 · 100 coins + a small bonus on first completion today
พลิก 0011 → 1100 แล้วบวก 1 → 1101 (ซึ่งแทนค่า $-3$)
เรียงขั้นตอนของการลบ B ออกจาก A โดยใช้วิธีสองส่วนเสริม
Difficulty 3/5 · 200 coins + a small bonus on first completion today
พลิก บวกหนึ่ง บวก ทิ้ง การทิ้ง carry คือสิ่งที่ทำให้คำตอบอยู่ในความกว้างของเรจสเตอร์
จำนวนเต็มมีเครื่องหมายแบบสองส่วนเสริม
- ในจำนวนสองส่วนเสริมขนาด $n$ บิต บิตที่มีค่าน้ำหนักมากที่สุด คือ บิตเครื่องหมาย: 0 หมายถึงบวก, 1 หมายถึงลบ แทนอีกนัยหนึ่งคือ บิตบนสุดมีค่าน้ำหนักเป็น ลบ คือ $-2^{n-1}$
- ในการอ่านค่าลบ: กลับค่าบิตทุกตัว บวก 1 แล้วใส่เครื่องหมายลบไว้ข้างหน้า
1011 0100กลับค่าเป็น0100 1011บวก 1 ได้0100 1100$= 76$ ดังนั้นค่าคือ $-76$. ตรวจสอบด้วยตำแหน่งที่มีค่าน้ำหนัก: $-128 + 32 + 16 + 4 = -76$. ✓ - สำหรับ $n$ บิต ช่วงค่าคือ $-2^{n-1}$ ถึง $+2^{n-1} - 1$: 8 บิต ให้ช่วง $-128$ ถึง $+127$, 12 บิต ให้ช่วง $-2048$ ถึง $+2047$. ค่าที่เป็นลบมากที่สุดคือ 1 ตามด้วยศูนย์; ค่าที่เป็นบวกมากที่สุดคือ 0 ตามด้วยหนึ่ง

11111111 คือ 255 เมื่ออ่านด้วยวิธีหนึ่ง และ −1 เมื่ออ่านอีกวิธีหนึ่ง
บิตที่มีเครื่องหมายแบบสองส่วนเสริม (Two's complement)
บิตทางซ้ายสุดมีตำแหน่งที่มีค่า ลบ พลิกบิตใดๆ — หรือกด Negate (พลิกทุกบิต แล้วบวก 1) — เพื่อดูว่าค่าที่มีเครื่องหมายเปลี่ยนไปอย่างไร
อ่านค่าเลขฐานสองแบบสองส่วนเสริมขนาด 8 บิต 11111101 เป็นค่าเลขฐานสิบที่มีเครื่องหมาย
Difficulty 2/5 · 140 coins + a small bonus on first completion today
MSB เป็น 1 (ค่าลบ) พลิก → 00000010 บวก 1 → 00000011 $= 3$ ดังนั้นค่าคือ $-3$
ค่าบวกสูงสุดที่เลขฐานสองแบบสองส่วนเสริมขนาด 8 บิตสามารถจัดเก็บได้คือเท่าใด?
Difficulty 2/5 · 140 coins + a small bonus on first completion today
ช่วงค่าคือ $-2^{7}$ ถึง $2^{7}-1$ นั่นคือ $-128$ ถึง $+127$ ค่าสูงสุดคือ 01111111 = 127
ตัวอย่างแสดงวิธีทำ: เขียน −108 ใน 12 บิต
- เริ่มต้นจาก $+108$ ใน 12 บิต: $108 = 64 + 32 + 8 + 4$ ดังนั้น
0000 0110 1100 - กลับค่าบิตทุกตัว:
1111 1001 0011. บวก 1:1111 1001 0100 - ตรวจสอบด้วยตำแหน่งที่มีค่าน้ำหนัก โดยที่บิตบนสุดมีค่า $-2048$: $-2048 + 1024 + 512 + 256 + 128 + 16 + 4 = -108$. ✓
- ข้อผิดพลาดที่พบบ่อยที่สุดคือการกำหนดรูปแบบสัญญาณและขนาด (sign and magnitude): ตั้งบิตบนสุดเป็น 1 และปล่อยบิตที่เหลือไว้ แบบนี้เป็นระบบเก่าอีกแบบหนึ่งและไม่ได้รับคะแนนในที่นี้
เขียน −108 เป็นเลขฐานสองแบบสองส่วนเสริมขนาด 12 บิต (ใช้ช่องว่างได้)
Difficulty 1/5 · 100 coins + a small bonus on first completion today
+108 คือ 0000 0110 1100; พลิกเป็น 1111 1001 0011 แล้วบวก 1 ตรวจสอบ: −2048 + 1024 + 512 + 256 + 128 + 16 + 4 = −108
ส่วนเสริมหนึ่ง (One's complement)
- One's complement เป็นระบบเก่า: การสร้างเลขลบคือการ สลับทุกบิต ของเลขบวก โดยไม่ต้องมีขั้นตอนเพิ่ม 1. $+30$ คือ
0001 1110ดังนั้น $-30$ จึงเป็น1110 0001. - จุดอ่อนของมันคือมี ศูนย์สองรูป คือ
0000 0000และ1111 1111ซึ่งสิ้นเปลืองแพทเทิร์นบิตและทำให้การคำนวณซับซ้อน - สองส่วนเสริมมีศูนย์เพียงรูปเดียวและทำให้วงจรบวกเดียวกันสามารถทำหน้าที่ลบได้ นี่คือเหตุผลที่มันชนะใจ
One's complement ดีกว่า two's complement เพราะมีรูปแบบเดียวสำหรับเลขศูนย์
Difficulty 1/5 · 100 coins + a small bonus on first completion today
ตรงกันข้าม: one's complement มีเลขศูนย์สองแบบ คือ +0 และ −0 ส่วน two's complement มีเพียงแบบเดียว และช่วยให้เครื่องบวกดำเนินการลบได้
เลขฐานสิบเข้ารหัสด้วยเลขฐานสอง (Binary Coded Decimal)
- ใน BCD แต่ละหลักเลขฐานสิบจะถูกจัดเก็บในรูปแบบ 4 บิตของตัวเอง โดยใช้เฉพาะ
0000ถึง1001 - 93 ใน BCD คือ
1001 0011ซึ่ง ไม่ใช่ สิ่งเดียวกันกับ 93 ในเลขฐานสองบริสุทธิ์0101 1101. การอ่านค่าหนึ่งด้วยอีกค่าหนึ่งเป็นกับดักข้อสอบยอดนิยม - การใช้: เครื่องคิดเลข, นาฬิกาดิจิตอลและ จอแสดงผลเจ็ดสегмент ที่แต่ละหลักถูกขับเคลื่อนแยกต่างหาก, และสกุลเงินที่ BCD ช่วยหลีกเลี่ยงข้อผิดพลาดการปัดเศษจากการเก็บ $0.1$ ในเลขฐานสองบริสุทธิ์. ราคาที่ต้องจ่ายคือการใช้แพทเทิร์นที่ไร้ประโยชน์ เนื่องจาก
1010ถึง1111ไม่เคยถูกใช้งาน

หนึ่งหลัก,หนึ่ง nibble,หนึ่งจอแสดงผล
เขียนเลขฐานสิบ $9$ เป็นรูปแบบ BCD ขนาด 4 บิต
Difficulty 1/5 · 100 coins + a small bonus on first completion today
$9$ คือ 1001 ใน BCD แต่ละหลักเลขฐานสิบจะได้รับนิบเบิลของตนเอง (0000–1001)
จับคู่รูปแบบบิตแต่ละชุดกับสิ่งที่มันแทนค่า
Difficulty 2/5 · 140 coins + a small bonus on first completion today
ไม่มีข้อมูลอะไรในบิตที่บอกวิธีการอ่าน ค่าขึ้นอยู่กับรูปแบบที่ตกลงกันไว้
คะแนนที่หลุดหายไป
- อธิบายการล้นของข้อมูลโดยใช้ ความกว้างของรีจสเตอร์ ที่โจทย์กำหนด ไม่ใช่ใช้ "เพราะมีค่ามากกว่า 255"
- ในการทำลบ (negate) ให้ สลับบิตและบวก 1 การตั้งค่าบิตบนสุดให้เป็น 1 คือวิธีการแสดงแบบ Sign and Magnitude ซึ่งเป็นระบบที่ต่างกัน
- การลบด้วย Two's complement จะสิ้นสุดด้วยการ ทิ้ง บิตถ่วงน้ำหนักสุดท้าย (carry-out) หากเก็บไว้จะได้คำตอบเป็น 9 บิต
- BCD เก็บแต่ละ หลักเลข แยกกัน; Binary แบบบริสุทธิ์เก็บทั้ง จำนวน
1001 0011คือ 93 ในรูปแบบ BCD และ 147 ในรูปแบบ binary
คุณเข้าใจแล้ว
- บวกทีละคอลัมน์พร้อมถ่วงน้ำหนัก; การล้นของข้อมูล (overflow) คือผลลัพธ์ที่ต้องการบิตมากกว่าที่รีจสเตอร์รองรับได้ และคำตอบจะระบุถึงความกว้างนั้น
- ลบโดยการบวกด้วย Two's complement สลับบิตและบวก 1 จากนั้นทิ้งการถ่วงน้ำหนักสุดท้าย
- Signed: MSB คือ บิตบอกเครื่องหมาย และถือ $-2^{n-1}$; ช่วงค่า $-2^{n-1}$ ถึง $+2^{n-1}-1$; อ่านค่าลบได้ด้วยการสลับบิต บวก 1 แล้วทำเครื่องหมายกลับด้าน
- One's complement ทำการสลับบิตเท่านั้นและมีศูนย์สองรูปแบบ; BCD เก็บแต่ละหลักเลขฐานสิบใน nibble ของมันเอง ใช้ในนาฬิกา เครื่องคิดเลข และสกุลเงิน