Làm thế nào để máy tính xác định xem một số nhỏ hơn hoặc lớn hơn số khác?


34

Nghe có vẻ giống như một câu hỏi ngu ngốc nhưng tôi thực sự tò mò muốn biết làm thế nào một máy tính biết rằng ? Ngoài ra, làm thế nào để một máy tính biết rằng thứ tự của số nguyên là và bảng chữ cái là A, B, C, D, ...? Nó được lưu trữ ở đâu đó trong phần cứng hay hệ điều hành cung cấp loại thông tin này?1<21,2,3,4,5,Giáo dục


1
Để câu hỏi này có thể được trả lời thỏa đáng, chúng ta sẽ phải biết Ricky Stam biết bao nhiêu về kiến ​​trúc máy tính. Từ câu hỏi có vẻ như rất ít, vì vậy không có câu trả lời ưa thích nào dưới đây sẽ dễ hiểu đối với anh ta.
Andrej Bauer

@AndrejBauer: Thật ra, anh ấy đã không đăng nhập kể từ khi đặt câu hỏi. Có lẽ bây giờ anh ấy biết tất cả những gì anh ấy cần.
Dave Clarke

Câu trả lời:


31

Đầu tiên số nguyên của bạn được chuyển đổi thành số nhị phân. Ví dụ, số nguyên 2 được chuyển đổi thành 0010.

CPU sử dụng bộ so sánh kỹ thuật số :

Bộ so sánh kỹ thuật số hoặc bộ so sánh cường độ là một thiết bị điện tử phần cứng lấy hai số làm đầu vào ở dạng nhị phân và xác định xem một số có lớn hơn hoặc nhỏ hơn hoặc bằng số kia hay không.

Bộ so sánh được sử dụng trong các đơn vị xử lý trung tâm (CPU) và vi điều khiển.

Nguồn: https://en.wikipedia.org/wiki/Digital_comparator

Trong phần cứng so sánh, một số cổng được sử dụng (AND, OR, NAND, NOR, XOR, v.v.). Các cổng này có đầu vào nhị phân và đưa ra kết quả trong nhị phân. Đầu ra có thể được nhìn thấy từ một bảng sự thật.

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

Dưới đây 0& 1là điện áp điện tử cho cổng.
1- Biểu thị một số điện áp ngưỡng cho biết một số điện áp dương.
0- Biểu thị điện áp dưới ngưỡng.

Ví dụ, giả sử một bộ so sánh hoạt động trên 5 volt (nó đang được xem xét để giải thích) thì:
Có thể coi điện áp hơn 3 volt là binary-1.
Điện áp dưới 3 volt được coi làbinary-0

Nếu một cổng nhận được một đầu vào là 3,5 volt và một đầu vào khác là 2 volt thì nó coi đó là một đầu vào dưới dạng nhị phân 1 và một đầu vào khác là nhị phân 0.

Các chuỗi 1 & 0 này được cung cấp rất nhanh thông qua mạch chuyển mạch.

Hoạt động của một bộ so sánh kỹ thuật số hai bit có thể được biểu diễn dưới dạng bảng chân lý:

 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

Để trích dẫn từ Wikipedia :

Ví dụ: Xét hai số nhị phân 4 bit A và B sao cho
nhập mô tả hình ảnh ở đây
nhập mô tả hình ảnh ở đây
Ở đây, mỗi chỉ số con đại diện cho một trong các chữ số trong các số.

Bình đẳng

Số nhị phân A và B sẽ bằng nhau nếu tất cả các cặp chữ số có nghĩa của cả hai số đều bằng nhau, nghĩa là
nhập mô tả hình ảnh ở đây. nhập mô tả hình ảnh ở đây. nhập mô tả hình ảnh ở đây. nhập mô tả hình ảnh ở đây

Vì các số là nhị phân, các chữ số là 0 hoặc 1 và hàm boolean cho đẳng thức của hai chữ số bất kỳ nhập mô tả hình ảnh ở đâyvà> nhập mô tả hình ảnh ở đâycó thể được biểu thị dưới dạng
nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây là 1 chỉ khi nhập mô tả hình ảnh ở đâynhập mô tả hình ảnh ở đây bằng nhau.

Để có sự bằng nhau của A và B, tất cả các nhập mô tả hình ảnh ở đâybiến (cho i = 0,1,2,3) phải là 1. Vì vậy, điều kiện chất lượng của A và B có thể được thực hiện bằng cách sử dụng phép toán AND làm
nhập mô tả hình ảnh ở đây
biến nhị phân (A = B) là 1 chỉ khi tất cả các cặp chữ số của hai số bằng nhau.

Bất bình đẳng

Để xác định thủ công hai số nhị phân lớn hơn, chúng tôi kiểm tra cường độ tương đối của các cặp chữ số có nghĩa, bắt đầu từ bit có ý nghĩa nhất, dần dần tiến tới các bit có ý nghĩa thấp hơn cho đến khi tìm thấy bất đẳng thức. Khi tìm thấy bất đẳng thức, nếu bit tương ứng của A là 1 và của B là 0 thì chúng ta kết luận rằng A> B. So sánh tuần tự này có thể được thể hiện một cách hợp lý như:

nhập mô tả hình ảnh ở đây


2
Whoa, chuyện gì đang xảy ra ở đây vậy?
Gilles 'SO- ngừng trở nên xấu xa'

1
"Đầu tiên số nguyên của bạn được chuyển đổi thành số nhị phân" ... sai, chỉ có số nhị phân trong bộ nhớ ở vị trí đầu tiên, tất cả là 1 và 0 ở cấp độ máy, do đó không có "hội tụ", 2 là đại diện là 10 từ đầu đến cuối ..
Dr.Haimovitz

Khi sao chép tài liệu từ các nguồn khác, bạn phải cung cấp phân bổ thích hợp cho các nguồn của mình. Xem ở đâyở đây .
DW

Bảng so sánh kỹ thuật số hai bit là không chính xác. ijesi.org/ con/Vol(2)1%20(version%202)/C211324.pdf khi A1, A0 đều bằng 0 nhưng B0 và B1 là 0, 1 A> B sẽ là 0, ví dụ.
dùng1455116

14

Nó không chỉ "biết", nó kiểm tra mọi lúc. Về cơ bản, nó thực hiện tương tự như bạn sẽ làm: để so sánh, nó kiểm tra (từ bên trái) số nào có chữ số đầu tiên lớn hơn chữ số tương ứng trong số khác. Tất nhiên bạn phải thêm các số 0 đứng đầu vào số ngắn hơn.

Chữ cái chỉ là số cho máy tính. Con người đã gán các số, ví dụ ASCII hoặc Unicode , cho các chữ cái để so sánh số cũng đưa ra thứ tự "chính xác" cho các chữ cái.


Ngoài ra, điều này thường được gọi là " thứ tự từ điển ". Chúng ta thường có thể nghĩ về nó như là thứ tự đầu tiên theo chiều dài (ngắn nhất đến dài nhất), sau đó theo thứ tự abc.
usul

@usul Điều đó nhắc nhở tôi rằng các chi tiết so sánh số nguyên rõ ràng phụ thuộc vào mã hóa cụ thể; những gì tôi mô tả hoạt động cho các số nhị phân "ngây thơ" có thể khác xa với những gì CPU thực tế sử dụng.
Raphael

Đúng, hoàn toàn. Gần đây tôi đã nghĩ về Turing Machines quá nhiều :). Máy móc thực sự không phù hợp với những gì chúng ta đã nói ở đây mọi lúc ....
usul

9

Đây không phải là hệ điều hành so sánh các số nguyên, CPU đang chăm sóc nó. Nó được thực hiện ở cấp độ cổng logic, vui lòng tham khảo các slide này để xem làm thế nào nó có thể được thực hiện.

Về bảng chữ cái, trong bảng chữ cái ASCII và các ký tự đặc biệt khác được biểu diễn dưới dạng số nguyên nên so sánh chúng cũng là một hoạt động so sánh số nguyên, được thực hiện bởi CPU.


4

Trên thực tế, và để có được hình ảnh đầy đủ của nó, tôi nghĩ sẽ rất hữu ích khi nhìn tận mắt cơ sở dữ liệu của một CPU thực tế, ví dụ MIPS: nhập mô tả hình ảnh ở đây

Như bạn có thể thấy, thực sự có một đầu ra thứ hai từ ALU, đó là một tín hiệu gọi là Zero. Nó tồn tại để thực hiện các hoạt động nhánh nhanh, sau khi xác định xem hai toán hạng so sánh có bằng 0 hay không , vì hầu hết các so sánh trong một chương trình là về các nhánh. Do đó, khi bạn tạo một khả năng chi nhánh trong mã của mình như:

nếu (a <b) {...}

  

Lưu ý rằng tín hiệu số 0 là một trong những đầu vào của cổng AND xác định nơi Bộ đếm chương trình (PC) sẽ lấy giá trị của nó từ: Giả sử tín hiệu Chi nhánh là '1', vì chúng ta có một hoạt động chi nhánh

Hy vọng tôi đã giúp bạn thấy "dưới nắp ca-pô". Hãy yêu cầu phân tích thêm về vấn đề này. Nhiều thứ chúng ta coi là điều hiển nhiên, CPU thực hiện chúng một cách rất hấp dẫn!


Ethan, hoạt động "ít" hoạt động như thế nào trên datapath này? Theo tôi hiểu, bạn mô tả hoạt động "không bằng". Hướng dẫn "slt" là gì?
osgx

2

Nếu bạn muốn biết làm thế nào một CPU thực sự làm điều đó, nó là một cái gì đó như thế này.

Một CPU hoạt động với số lượng chỉ lên đến một kích thước nhất định. Ngày nay, đó thường là các số nguyên 64 bit (chúng ta sẽ bỏ qua các số có dấu phẩy động; ý tưởng sẽ tương tự).

Vì vậy, chúng ta nên nhận ra rằng

  1. Một CPU đang lưu trữ các số dài tới 64 bit ở dạng nhị phân, ở một số định dạng (có thể là bổ sung 2 giây nhưng nó không quan trọng quá nhiều).

  2. Một CPU thực sự không thể làm bất cứ điều gì với số lượng lớn hơn thế. Chúng ta phải viết các thuật toán phần mềm nếu chúng ta muốn so sánh các số lớn hơn.

mộtb

một-bmột-bnhỏ hơn không. Nó thực hiện điều này với một hoạt động riêng có thể hoạt động, ở cấp độ mạch, giống như các thuật toán so sánh mà các câu trả lời khác đã mô tả. Nó sẽ trông rất giống với những cái đó, nhưng tất cả được thực hiện trong các mạch (vì số lượng tối đa là 64 bit, đây là một mạch có kích thước nhất định mà chúng ta có thể gắn và gắn vào CPU.) Tùy thuộc vào cách CPU lưu trữ số, nó có thể còn nhanh hơn bởi vì có thể là tất cả các số âm có bit đầu tiên được đặt thành một hoặc một cái gì đó tương tự. Dù bằng cách nào, chỉ có tổng cộng 64 bit, vì vậy chúng tôi chắc chắn có thể kiểm tra xem con số này có âm hay không.

một<bmộtb

Bây giờ, đối với số lượng lớn hơn, chúng ta phải thực hiện một cái gì đó trong phần mềm sẽ sử dụng các so sánh nhỏ này làm chương trình con.


1

Để trả lời câu hỏi này cho tôi đầu tiên chỉ ra rằng có ít nhất hai cấp độ trên trừu tượng cho những con số so sánh trên một máy tính, các máy cấp , và mức độ phần mềm .

So sánh số ở cấp độ máy

Trong máy tính ngày nay, CPU có một bộ hướng dẫn phong phú. Các hướng dẫn này bao gồm ví dụ tải một ô nhớ vào một thanh ghi, tăng một thanh ghi, thêm hai thanh ghi và nhiều hơn nữa. Cũng phải có hướng dẫn cho các bước nhảy có điều kiện . Ví dụ: các bộ xử lý trong họ x86 của Intel hỗ trợ các hướng dẫn jnz(nhảy nếu không bằng 0), jne(nhảy không bằng), v.v. Nếu những cái đó bị thiếu thì CPU sẽ không hoàn thành. Các biến mà từ đó bước nhảy có điều kiện phụ thuộc được lưu trữ trong các thanh ghi. Do đó, các hướng dẫn này được kết nối cứng trong kiến ​​trúc của CPU khi xây dựng mạch từ các cổng logic. Đây là cách duy nhất để CPU có thể so sánh hai số.

So sánh số ở cấp độ phần mềm

Nếu bạn so sánh hai số, giả sử trong một chương trình c ++, thì số này được dịch thành mã máy và do đó được thực hiện ở cấp độ máy. Tuy nhiên, so sánh như vậy có thể phức tạp hơn. Nó thực sự phụ thuộc vào kiểu dữ liệu bạn đã sử dụng cách so sánh được dịch thành mã máy. Chỉ cần một ví dụ, các số bạn muốn so sánh là từ các từ 64 Bit nhưng máy của bạn chỉ hoạt động với 32 bit. Sau đó, số này không phù hợp với một thanh ghi, do đó trình biên dịch sẽ chia sự so sánh thành một chuỗi các so sánh ở cấp mã máy. Điều tương tự cũng áp dụng cho các kiểu dữ liệu / cấu trúc dữ liệu phức tạp hơn, đại diện cho các số hữu tỷ hoặc chuỗi hoặc ký tự. Do đó, khi bạn phải so sánh hai ký tự, điều này sẽ được dịch bởi phần mềm (hệ điều hành, trình biên dịch, trình thông dịch, ...) thành mã máy.

Như một nhận xét cuối cùng tôi muốn chỉ ra rằng các CPU tiêu chuẩn cũng có thể hoạt động với các cách biểu diễn khác nhau của các số (số nguyên được ký trong biểu diễn bổ sung 1- hoặc 2, số float). Ngoài ra, việc so sánh có thể được thực hiện ở các bộ phận khác của máy tính như GPU.


0

các câu trả lời khác là tốt, chỉ cần ném một câu hỏi khác ra khỏi đó để xem xét / hiểu biết sâu sắc hơn với hương vị / xoắn CS. người ta có thể xây dựng một FSM , một máy trạng thái hữu hạn, có thể so sánh hai số nhị phân có độ dài bất kỳ, bắt đầu theo cặp từ các bit quan trọng nhất và làm việc với bit có trọng số thấp nhất (LSB). nó cũng có thể được sử dụng để khái niệm hóa bộ so sánh kỹ thuật số được đưa ra trong một câu trả lời khác, tuy nhiên, FSM không yêu cầu số nhị phân có độ dài hữu hạn. nó thậm chí có thể hoạt động trên các số nguyên với phân số nhị phân sau LSB. nó có một hương vị quy nạp và đệ quy và có thể được chứng minh là đúng bằng cách cảm ứng đơn giản. nó chạy như sau:

  • nhập hai chữ số nhị phân trên cùng dưới dạng một cặp (a, b)
  • nếu a = 1 và b = 0 thì số bên trái lớn hơn.
  • nếu a = 0 và b = 1, số bên phải lớn hơn.
  • nếu không, các số là "bằng cho đến bây giờ", chuyển sang cặp tiếp theo.

nói cách khác, số lớn nhất là số có lần xuất hiện đầu tiên của một bit là một và số kia bằng 0, sau lần chạy đầu tiên bằng 0 hoặc nhiều hơn 1 giây. một bộ so sánh kỹ thuật số có độ dài hữu hạn được tạo từ các cổng hoặc bộ so sánh 1 bit có thể được xem như là dựa trên việc sửa độ dài của hoạt động FSM này với một số bit cố định. (vâng, có một sự tương ứng mạnh mẽ giữa tất cả các mạch hữu hạn và "sửa chữa độ dài" của các tính toán FSM.)

điều này có vẻ giống như một bài tập lý thuyết nhưng thực ra, logic trong phần mềm để biểu diễn các số chính xác tùy ý vận hành một cái gì đó tương tự với FSM này, ngoại trừ được mã hóa trong một vòng lặp máy tính có thể được xem như lặp lại hoặc mô phỏng các bước của FSM (một cách triển khai hiệu quả có thể theo dõi thông qua một chỉ mục vị trí của MSB).


đồng thời, cho phép giải thích / khái quát hóa câu hỏi này một cách hợp lý vì không giới hạn số nguyên . câu hỏi đề cập đến số nguyên nhưng tiêu đề chỉ đề cập đến số. đáng ngạc nhiên không ai khác đề cập đến số học dấu phẩy động cho đến nay.

một×10bmộtb

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.