2012-06-05 65 views
5

Hai bổ sung được thiết lập để giúp máy tính dễ dàng tính toán độ nền của hai số. Nhưng làm thế nào máy tính phân biệt một số nguyên được ký số nguyên hoặc số nguyên unsigned? Chỉ 0 và 1 trong bộ nhớ của nó.Cách máy tính phân biệt một số nguyên được ký hoặc chưa ký?

Đối với exmaple, 1111 1111 trong bộ nhớ máy tính có thể đại diện cho số 255 nhưng cũng có thể đại diện cho -1.

+0

xem http://en.wikipedia.org/wiki/Signedness và http://en.wikipedia.org/wiki/Signed_number_representations – mtijn

+0

Tôi không hỏi cách số đã ký được thể hiện trong máy tính – viperchaos

+0

bạn đã đọc liên kết? Chúng được ghi nhận bởi vì chúng có liên quan đến câu hỏi của bạn – mtijn

Trả lời

10

Đã ký và chưa ký sử dụng cùng một dữ liệu, nhưng các hướng dẫn khác nhau.

Máy tính lưu trữ các số nguyên đã ký và chưa ký dưới dạng dữ liệu giống nhau. I E. 255 và -1 là các bit giống nhau. Tuy nhiên, bạn cho trình biên dịch biết loại biến có. Nếu nó được ký, trình biên dịch sử dụng toán tử đã ký để thao tác các biến (ví dụ: IDIV) và khi không được ký, trình biên dịch sẽ sử dụng một lệnh khác (ví dụ: DIV). Vì vậy, trình biên dịch tạo ra một chương trình cho CPU biết cách diễn giải dữ liệu.

+1

Cần lưu ý rằng trên hầu hết các CPU, lệnh chỉ khác nhau trong trường hợp nhân (MUL/IMUL cho IA32) và phép chia (DIV/IDIV) ([tham chiếu lệnh] (http: //www.posix.nl/linuxassembly/nasmdochtml/nasmdoca.html)). Điều tiện lợi về bổ sung 2 là không thực sự dễ dàng hơn để trừ, nhưng bổ sung (ADD) không quan tâm nếu các con số được ký hoặc unsigned. Bởi vì điều này, trừ là thực sự dễ dàng hơn, vì trừ một có thể dễ dàng tính toán bổ sung 2 của subtrahend và thêm nó vào minuend. –

2

Nó không phân biệt chúng. Nhưng với sự bổ sung, tính toán giống nhau:

Dưới đây, d sẽ được nối thêm vào số thập phân và b thành số nhị phân. Các tính toán sẽ có số nguyên 8 bit.

-1d + 1d = 1111 1111b + 1b = 1 0000 0000b

Nhưng kể từ khi chúng tràn (vâng, đó là 8 0 s và một 1 trên 8 bit số nguyên), kết quả là bằng 0.

-2d + 1d = 1111 1110b + 1b = 1111 1111b = -1d

-1d + 2d = 1111 1111b + 10b = 1 0000 0001b (this overflows) = 1b = 1d

-1d + -1d = 1111 1111b + 1111 1111b = 1 1111 1110b (this overflows) = 1111 1110b = -2d

Và nếu bạn xem xét các hoạt động trên unsigned (giá trị nhị phân sẽ không thay đổi):

255d + 1d = 1111 1111b + 1b = 1 0000 0000b (this overflows) = 0d

254d + 1d = 1111 1110b + 1b = 1111 1111b = 255d

255d + 2d = 1111 1111b + 10b = 1 0000 0001b (this overflows) = 1b = 1d

255d + 255d = 1111 1111b + 1111 1111b = 1 1111 1110b (this overflows) = 1111 1110b = 2d

Unsigned so với ký là như vậy, chỉ là trình bày hình ảnh của chưa ký, chỉ được sử dụng khi hiển thị cho một người :-)

Các vấn đề liên quan