คอมพิวเตอร์ตรวจสอบว่าตัวเลขมีขนาดเล็กกว่าหรือมากกว่าได้อย่างไร


34

มันอาจฟังดูเหมือนคำถามงี่เง่า แต่ฉันอยากรู้จริงๆว่าคอมพิวเตอร์รู้ได้อย่างไรว่า ? คอมพิวเตอร์จะทราบได้อย่างไรว่าลำดับของจำนวนเต็มคือและตัวอักษรคือ A, B, C, D, ... มีที่เก็บไว้ในฮาร์ดแวร์หรือระบบปฏิบัติการให้ข้อมูลประเภทนี้หรือไม่?1 , 2 , 3 , 4 , 5 , ...1<21,2,3,4,5,...


1
เพื่อให้คำถามนี้ตอบได้อย่างน่าพอใจเราจะต้องรู้ว่า Ricky Stam รู้เกี่ยวกับสถาปัตยกรรมคอมพิวเตอร์มากน้อยเพียงใด จากคำถามดูเหมือนน้อยมากดังนั้นไม่มีคำตอบแฟนซีใด ๆ ด้านล่างที่จะเข้าใจได้
Andrej Bauer

@AndrejBauer: ที่จริงแล้วเขาไม่ได้เข้าสู่ระบบตั้งแต่ถามคำถาม บางทีตอนนี้เขารู้ทุกอย่างที่เขาต้องการ
Dave Clarke

คำตอบ:


31

ก่อนอื่นตัวเลขจำนวนเต็มของคุณจะถูกแปลงเป็นเลขฐานสอง ตัวอย่างเช่นจำนวนเต็ม 2 ถูกแปลงเป็น 0010

CPU ใช้ตัวเปรียบเทียบแบบดิจิทัล :

เปรียบเทียบดิจิตอลหรือขนาดเปรียบเทียบเป็นอุปกรณ์อิเล็กทรอนิกส์ฮาร์ดแวร์ที่จะใช้เวลาสองหมายเลขเป็น input ในรูปแบบไบนารีและกำหนดว่าหนึ่งในจำนวนมากกว่าหรือน้อยกว่าหรือเท่ากับจำนวนอื่น ๆ

เครื่องมือเปรียบเทียบใช้ในหน่วยประมวลผลกลาง (CPU) และไมโครคอนโทรลเลอร์

ที่มา: https://en.wikipedia.org/wiki/Digital_comparator

ในฮาร์ดแวร์ตัวเปรียบเทียบบางตัวจะใช้ (และ, OR, NAND, NOR, XOR ฯลฯ ) ประตูเหล่านี้รับสัญญาณเข้าแบบไบนารีและให้ผลลัพธ์เป็นแบบไบนารี ผลลัพธ์สามารถดูได้จากตารางความจริง

Inputs           Outputs
A   B     A>B    A=B    A<B
0   0     0       1      0
0   1     0       0      1
1   0     1       0      0
1   1     0       1      0

ที่นี่0และ1มีแรงดันไฟฟ้าอิเล็กทรอนิกส์สำหรับประตู
1- แสดงถึงแรงดันไฟฟ้าเกณฑ์ที่บ่งบอกถึงแรงดันไฟฟ้าบวกบางอย่าง
0- แสดงถึงแรงดันไฟฟ้าต่ำกว่าเกณฑ์

เช่นสมมติว่าเปรียบเทียบผลงานในวันที่ 5 โวลต์ (มันมีการพิจารณาสำหรับคำอธิบาย) แล้ว:
แรงดันไฟฟ้าเกิน 3 binary-1โวลต์ถือได้ว่าเป็น
แรงดันไฟฟ้าต่ำกว่า 3 โวลต์ถือว่าเป็นbinary-0

หากเกตได้รับอินพุตหนึ่งตัวเป็น 3.5 โวลต์และอีกอินพุตเป็น 2 โวลต์ก็จะถือว่าเป็นมันจะรับอินพุตหนึ่งเป็นไบนารี่ 1 และอินพุตอีกอันเป็นไบนารี 0

ลำดับของ 1 & 0 เหล่านี้มีให้อย่างรวดเร็วผ่านวงจรสวิตชิ่ง

การทำงานของตัวเปรียบเทียบดิจิตอลสองบิตสามารถแสดงเป็นตารางความจริง:

 Inputs                            Outputs
   A1   A0  B1  B0  A>B    A=B   A<B        
    0   0   0   0    0      1     0
    0   0   0   1    1      0     0
    0   0   1   0    1      0     0
    0   0   1   1    1      0     0
    0   1   0   0    0      0     1
    0   1   0   1    0      1     0
    0   1   1   0    1      0     0
    0   1   1   1    1      0     0
    1   0   0   0    0      0     1
    1   0   0   1    0      0     1
    1   0   1   0    0      1     0
    1   0   1   1    1      0     0
    1   1   0   0    0      0     1
    1   1   0   1    0      0     1
    1   1   1   0    0      0     1
    1   1   1   1    0      1     0

อ้างจากWikipedia :

ตัวอย่าง: พิจารณาเลขฐานสอง 4 บิต A และ B สองตัวที่
ป้อนคำอธิบายรูปภาพที่นี่
ป้อนคำอธิบายรูปภาพที่นี่
นี่ตัวห้อยแต่ละตัวแทนตัวเลขหนึ่งตัวในตัวเลข

ความเท่าเทียมกัน

เลขฐานสอง A และ B
ป้อนคำอธิบายรูปภาพที่นี่จะเท่ากับหากทุกคู่ของตัวเลขที่มีนัยสำคัญของตัวเลขทั้งสองมีค่าเท่ากันคือ ป้อนคำอธิบายรูปภาพที่นี่. ป้อนคำอธิบายรูปภาพที่นี่. ป้อนคำอธิบายรูปภาพที่นี่

เนื่องจากตัวเลขเป็นเลขฐานสองหลักจึงเป็น 0 หรือ 1 และฟังก์ชันบูลีนเพื่อความเท่าเทียมกันของตัวเลขสองหลักใด ๆป้อนคำอธิบายรูปภาพที่นี่และ> ป้อนคำอธิบายรูปภาพที่นี่สามารถแสดงเป็น
ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่ เป็น 1 ก็ต่อเมื่อป้อนคำอธิบายรูปภาพที่นี่และป้อนคำอธิบายรูปภาพที่นี่ เท่ากัน

สำหรับความเสมอภาคของ A และ B ป้อนคำอธิบายรูปภาพที่นี่ตัวแปรทั้งหมด(สำหรับ i = 0,1,2,3) ต้องเป็น 1 ดังนั้นสภาพคุณภาพของ A และ B สามารถนำมาใช้โดยใช้การดำเนินการ AND เป็น
ป้อนคำอธิบายรูปภาพที่นี่
ตัวแปรไบนารี (A = B) เป็น 1 ก็ต่อเมื่อทุกคู่ของตัวเลขทั้งสองมีค่าเท่ากัน

ความไม่เสมอภาค

เพื่อที่จะกำหนดเลขฐานสองที่มากขึ้นด้วยตนเองเราจะตรวจสอบขนาดสัมพัทธ์ของคู่ของตัวเลขนัยสำคัญเริ่มต้นจากบิตที่สำคัญที่สุดค่อยๆดำเนินการไปสู่บิตที่มีความสำคัญต่ำกว่าจนกระทั่งพบความไม่เท่าเทียมกัน เมื่อพบความไม่เท่าเทียมกันถ้าบิตที่สอดคล้องกันของ A คือ 1 และของ B เป็น 0 เราจะสรุปว่า A> B การเปรียบเทียบตามลำดับนี้สามารถแสดงเหตุผลได้ดังนี้:

ป้อนคำอธิบายรูปภาพที่นี่


2
ว้าวเกิดอะไรขึ้นที่นี่?
Gilles 'หยุดชั่วร้าย'

1
"ก่อนอื่นตัวเลขจำนวนเต็มของคุณจะถูกแปลงเป็นเลขฐานสอง" ... ผิดมีเพียงเลขฐานสองในหน่วยความจำในตอนแรกมันคือ 1 และ 0 ทั้งหมดในระดับเครื่องดังนั้นจึงไม่มี "การแปลง" 2 แสดงเป็น 10 ตั้งแต่ต้นจนจบ ..
Dr.Haimovitz

เมื่อคัดลอกเนื้อหาจากแหล่งอื่นคุณต้องระบุแหล่งที่มาที่เหมาะสมสำหรับแหล่งที่มาของคุณ ดูที่นี่และที่นี่
DW

ตารางตัวเปรียบเทียบดิจิตอลสองบิตไม่ถูกต้อง ijesi.org/papers/Vol(2)1%20(version%202)/C211324.pdfเมื่อ A1, A0 มีทั้งศูนย์ แต่ B0 และ B1 เป็น 0, 1 A> B จะเป็น 0 เช่น
user1455116

14

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

ตัวอักษรเป็นเพียงตัวเลขสำหรับคอมพิวเตอร์ มนุษย์ได้กำหนดหมายเลขไว้เช่นตัวอักษรASCIIหรือUnicodeเพื่อให้การเปรียบเทียบจำนวนนั้นให้ลำดับ "ถูกต้อง" สำหรับตัวอักษรเช่นกัน


นอกจากนี้สิ่งนี้มักจะเรียกว่า " คำสั่งทำพจนานุกรม " เรามักจะคิดว่ามันเป็นลำดับแรกตามความยาว (สั้นที่สุดถึงยาวที่สุด) ตามลำดับตัวอักษร
usul

@usul นั่นทำให้ฉันนึกว่ารายละเอียดของการเปรียบเทียบจำนวนเต็มนั้นขึ้นอยู่กับการเข้ารหัสเฉพาะ สิ่งที่ฉันอธิบายใช้งานได้สำหรับเลขฐานสอง "ไร้เดียงสา" ซึ่งอาจอยู่ไกลจากสิ่งที่ซีพียูใช้จริง
กราฟิลส์

ใช่แน่นอน ฉันคิดเกี่ยวกับทัวริงแมชชีนมากเกินไปเร็ว ๆ นี้ :) เครื่องจริงไม่เหมาะกับสิ่งที่เราพูดที่นี่ตลอดเวลา ....
usul

9

ไม่ใช่ระบบปฏิบัติการที่เปรียบเทียบจำนวนเต็ม แต่ CPU กำลังดูแลอยู่ มันทำในระดับประตูตรรกะโปรดดูสไลด์เหล่านี้เพื่อดูว่ามันสามารถทำได้

เกี่ยวกับตัวอักษรในASCIIตัวอักษรและตัวเลขและอักขระพิเศษอื่น ๆ แสดงเป็นจำนวนเต็มดังนั้นการเปรียบเทียบจึงเป็นการดำเนินการเปรียบเทียบจำนวนเต็มซึ่งดำเนินการโดย CPU


4

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

ดังที่คุณเห็นจริง ๆ แล้วมีเอาต์พุตที่สองจาก ALU ซึ่งเป็นสัญญาณที่เรียกว่า Zero มันมีอยู่เพื่อดำเนินการสาขาอย่างรวดเร็วหลังจากพิจารณาว่าตัวถูกดำเนินการสองรายการเปรียบเทียบเท่ากับศูนย์หรือไม่เนื่องจากการเปรียบเทียบส่วนใหญ่ภายในโปรแกรมนั้นเกี่ยวกับสาขา ดังนั้นเมื่อคุณสร้างความเป็นไปได้สาขาในรหัสของคุณเช่น:

ถ้า (a <b) {... }

  

โปรดสังเกตว่าสัญญาณศูนย์เป็นหนึ่งในอินพุตของประตู AND ที่กำหนดว่าตัวนับโปรแกรม (PC) จะรับค่าจาก: สมมติว่าสัญญาณสาขาคือ '1' เนื่องจากเรามีการดำเนินการสาขา

หวังว่าฉันช่วยให้คุณเห็น "ภายใต้ฝากระโปรง" อย่าลังเลที่จะขอวิเคราะห์เพิ่มเติมในเรื่องนี้ หลายสิ่งหลายอย่างที่เราให้สิทธิ์ซีพียูทำมันด้วยวิธีที่น่าทึ่งมาก!


อีธานการทำงาน "น้อยลง" บนดาต้าแพทนี้ทำงานอย่างไร ดังที่ฉันเข้าใจคุณได้อธิบายการดำเนินการ "ไม่เท่ากัน" คำสั่ง "slt" คืออะไร?
osgx

2

หากคุณต้องการทราบว่าซีพียูที่แท้จริงทำอย่างไรมันเป็นอะไรแบบนี้

ซีพียูทำงานด้วยจำนวนที่มากถึงขนาดที่แน่นอน ทุกวันนี้มักจะเป็นจำนวนเต็ม 64 บิต (เราจะเพิกเฉยต่อจำนวนจุดลอยตัวแนวคิดจะคล้ายกัน)

ดังนั้นเราควรตระหนักว่า

  1. ซีพียูจัดเก็บตัวเลขได้มากถึงขนาด 64 บิตในรูปแบบไบนารี่ในบางรูปแบบ (อาจเป็นส่วนเสริม 2sแต่มันไม่สำคัญอะไรมาก)

  2. CPU ไม่สามารถทำสิ่งใดกับตัวเลขที่ใหญ่กว่านั้นได้ เราต้องเขียนอัลกอริธึมซอฟต์แวร์ถ้าเราต้องการเปรียบเทียบตัวเลขที่ใหญ่กว่า

a

a-a-น้อยกว่าศูนย์ มันทำสิ่งนี้ด้วยการทำงานแบบเนทีฟเดี่ยวที่สามารถทำงานได้ในระดับวงจรเช่นอัลกอริธึมเปรียบเทียบที่คำตอบอื่น ๆ มันจะมีลักษณะเหมือนกัน แต่มีการใช้งานทั้งหมดในวงจร (เนื่องจากจำนวนสูงสุด 64 บิตนี่เป็นวงจรขนาดที่แน่นอนที่เราสามารถ hardwire และติดกับ CPU) ขึ้นอยู่กับวิธีที่ CPU เก็บหมายเลขมัน อาจจะเร็วกว่าเพราะอาจเป็นได้ว่าจำนวนลบทั้งหมดตั้งค่าบิตแรกเป็นหนึ่งหรืออย่างนั้น ทั้งสองวิธีมีทั้งหมด 64 บิตดังนั้นเราจึงสามารถตรวจสอบได้ว่าตัวเลขนี้เป็นลบหรือไม่

a<a

ตอนนี้สำหรับจำนวนที่มากขึ้นเราต้องใช้บางสิ่งบางอย่างในซอฟต์แวร์ที่จะใช้การเปรียบเทียบขนาดเล็กเหล่านี้เป็นรูทีนย่อย


1

เพื่อตอบคำถามนี้ให้ฉันก่อนชี้ให้เห็นว่ามีอย่างน้อยสองระดับบนที่เป็นนามธรรมสำหรับตัวเลขเปรียบเทียบบนคอมพิวเตอร์ที่ระดับเครื่องและซอฟต์แวร์ระดับ

การเปรียบเทียบตัวเลขในระดับเครื่อง

ในคอมพิวเตอร์ทุกวันนี้ซีพียูมีชุดคำสั่งมากมาย คำแนะนำเหล่านี้รวมถึงการโหลดเซลล์หน่วยความจำลงในการลงทะเบียนการเพิ่มการลงทะเบียนการเพิ่มการลงทะเบียนสองครั้งและอื่น ๆ อีกมากมาย จะต้องมีคำแนะนำสำหรับการกระโดดตามเงื่อนไขด้วย ตัวอย่างเช่นโปรเซสเซอร์ในตระกูล x86 ของ Intel สนับสนุนคำแนะนำjnz(กระโดดถ้าไม่เป็นศูนย์), jne(กระโดดไม่เท่ากัน) และอื่น ๆ หากสิ่งเหล่านั้นขาดหายไป CPU จะไม่สมบูรณ์แบบทัวริง ตัวแปรที่ขึ้นอยู่กับเงื่อนไขการกระโดดจะถูกเก็บไว้ในรีจิสเตอร์ ดังนั้นคำแนะนำเหล่านี้จึงใช้สายแบบแข็งในสถาปัตยกรรมของ CPU เป็นวงจรที่สร้างจากลอจิกเกต นี่เป็นวิธีเดียวที่ CPU สามารถเปรียบเทียบตัวเลขสองตัวได้

การเปรียบเทียบตัวเลขในระดับซอฟต์แวร์

หากคุณเปรียบเทียบตัวเลขสองตัวให้พูดในโปรแกรม c ++ นี่จะแปลเป็นรหัสเครื่องและดำเนินการกับระดับเครื่อง อย่างไรก็ตามการเปรียบเทียบดังกล่าวอาจมีความซับซ้อนมากขึ้น มันขึ้นอยู่กับประเภทข้อมูลที่คุณใช้ในการแปลการเปรียบเทียบเป็นรหัสเครื่อง ตัวอย่างเดียวตัวเลขที่คุณต้องการเปรียบเทียบนั้นมาจากคำ 64 บิต แต่เครื่องของคุณใช้งานได้กับ 32 บิตเท่านั้น ดังนั้นหมายเลขนี้จึงไม่พอดีกับการลงทะเบียนดังนั้นคอมไพเลอร์จะแยกการเปรียบเทียบออกเป็นลำดับการเปรียบเทียบในระดับรหัสเครื่อง เช่นเดียวกับโครงสร้างข้อมูล / โครงสร้างข้อมูลที่มีความซับซ้อนมากขึ้นซึ่งแสดงถึงจำนวนตัวอย่างเช่นจำนวนตรรกยะหรือสตริงหรือตัวอักษร ดังนั้นเมื่อคุณต้องเปรียบเทียบอักขระสองตัวนี่คือการแปลโดยซอฟต์แวร์ (ระบบปฏิบัติการคอมไพเลอร์ล่าม, ... ) เป็นรหัสเครื่อง

ตามคำพูดสุดท้ายฉันต้องการชี้ให้เห็นว่าซีพียูมาตรฐานสามารถทำงานร่วมกับการแสดงตัวเลขที่แตกต่างกัน การเปรียบเทียบอาจดำเนินการในส่วนอื่น ๆ ของคอมพิวเตอร์เช่น GPU


0

คำตอบอื่น ๆ นั้นดีเพียงแค่โยนคำตอบออกไปเพื่อพิจารณา / ทำความเข้าใจกับ CS รส / บิด เราสามารถสร้างFSMซึ่งเป็นเครื่องจักรสถานะ จำกัด ที่สามารถเปรียบเทียบเลขฐานสองสองตัวของความยาวใดก็ได้เริ่มต้นจากจำนวนบิตที่สำคัญที่สุดและทำงานกับบิตที่มีนัยสำคัญน้อยที่สุด (LSB) นอกจากนี้ยังสามารถใช้เพื่อสร้างแนวคิดให้ตัวเปรียบเทียบดิจิทัลที่ให้ไว้ในคำตอบอื่นได้ แต่ FSM ไม่จำเป็นต้องใช้เลขฐานสองที่มีความยาว จำกัด มันยังสามารถทำงานกับจำนวนเต็มด้วยเศษส่วนไบนารีหลังจาก LSB มันมีรสชาติที่เหนี่ยวนำและซ้ำและสามารถพิสูจน์ได้ว่าถูกต้องโดยการเหนี่ยวนำง่าย มันทำงานดังนี้:

  • ใส่เลขฐานสองสองอันดับแรกเป็นคู่ (a, b)
  • ถ้า a = 1 และ b = 0 ตัวเลขที่เหลือจะใหญ่กว่า
  • ถ้า a = 0 และ b = 1 ตัวเลขที่ถูกต้องจะใหญ่กว่า
  • มิฉะนั้นตัวเลขจะเท่ากับ "เท่ากับตอนนี้" เลื่อนไปยังคู่ต่อไป

กล่าวอีกนัยหนึ่งจำนวนที่มากที่สุดคือสิ่งที่เกิดขึ้นครั้งแรกของบิตนั่นคือหนึ่งและอื่น ๆ ที่เป็นศูนย์หลังจากวิ่งครั้งแรกของศูนย์หรือมากกว่า 1 เหมือนกัน ตัวเปรียบเทียบแบบดิจิทัลความยาว จำกัด ที่ทำจากเกตส์หรือตัวเปรียบเทียบแบบ 1 บิตสามารถมองเห็นได้โดยอิงจากการกำหนดความยาวของการดำเนินการ FSM นี้ให้มีจำนวนบิตคงที่ (ใช่มีการติดต่อที่แข็งแกร่งระหว่างวงจร จำกัด และ "การตรึงความยาว" ของการคำนวณ FSM)

สิ่งนี้อาจดูเหมือนการออกกำลังกายทางทฤษฎี แต่ที่จริงแล้วตรรกะในซอฟต์แวร์เพื่อเป็นตัวแทนของตัวเลขที่มีความแม่นยำตามอำเภอใจนั้นมีอะไรบางอย่างที่คล้ายกับ FSM นี้ยกเว้นการเข้ารหัสในคอมพิวเตอร์ลูปที่สามารถเห็นได้ว่าวนซ้ำ อาจติดตามผ่านดัชนีตำแหน่งของ MSB)


นอกจากนี้ยังช่วยให้สมเหตุสมผลตีความ / คุยคำถามนี้เป็นไม่ จำกัด จำนวนเต็ม คำถามหมายถึงจำนวนเต็ม แต่ชื่อหมายถึงตัวเลขเท่านั้น น่าประหลาดใจที่ไม่มีใครพูดถึงเลขทศนิยมจนถึงตอนนี้

a×10a

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