Tại sao thích hai phần bù hơn số ký và độ lớn cho số đã ký?


201

Tôi chỉ tò mò liệu có lý do tại sao để biểu diễn -1 ở dạng nhị phân, phần bù hai được sử dụng: lật các bit và thêm 1?

-1 được biểu thị bằng 11111111 (bổ sung hai) thay vì (với tôi trực quan hơn) 10000001 là nhị phân 1 với bit đầu tiên là cờ âm.

Tuyên bố miễn trừ trách nhiệm: Tôi không dựa vào số học nhị phân cho công việc của mình!


6
FWIW, phương pháp sử dụng bit ký hiệu "trực quan" của bạn được sử dụng một cách ngẫu nhiên - ví dụ, hầu hết các máy tính sử dụng bit ký hiệu khi biểu diễn các số dấu phẩy động.
Adisak

2
@Adisak Nó được gọi là cường độ đã ký
Cole Johnson

2
Tôi đã luôn liên kết biểu diễn ký hiệu và cường độ với các số nguyên vì các số Dấu phẩy động chứa ba thành phần: một dấu, số mũ và một lớp phủ (thường có ẩn '1'). Nhưng tôi đoán nó đủ dễ dàng để coi số mũ và mantissa có độ lớn miễn là người ta nhận ra chúng không hoàn toàn tuyến tính.
Adisak

Đây là một bài viết thảo luận về cách các số dấu phẩy động được lưu trữ trong hệ nhị phân, cho những ai tò mò về nhận xét của @ Adisak.
GDP2

Chỉ cần xem một video hay giải thích về youtube.com/watch?v=dHB7jFjESLY
allenlinli

Câu trả lời:


333

Nó được thực hiện sao cho việc bổ sung không cần phải có logic đặc biệt nào để xử lý các số âm. Kiểm tra bài viết trên Wikipedia .

Giả sử bạn có hai số, 2 và -1. Trong của bạn theo cách "trực quan" đại diện cho số, họ sẽ 00101001tương ứng (tôi gắn bó với 4 bit cho kích thước). Theo cách bổ sung của hai , chúng là 00101111. Bây giờ, hãy nói rằng tôi muốn thêm chúng.

Bổ sung hai là rất đơn giản. Bạn thêm số bình thường và bất kỳ bit mang nào ở cuối sẽ bị loại bỏ. Vì vậy, họ được thêm vào như sau:

  0010
+ 1111
=10001
= 0001 (discard the carry)

0001 là 1, là kết quả mong đợi của "2 + (- 1)".

Nhưng trong phương pháp "trực quan" của bạn, việc thêm phức tạp hơn:

  0010
+ 1001
= 1011

Đó là -3, phải không? Bổ sung đơn giản không hoạt động trong trường hợp này. Bạn cần lưu ý rằng một trong các số là âm và sử dụng thuật toán khác nếu đó là trường hợp.

Đối với phương pháp lưu trữ "trực quan" này, phép trừ là một hoạt động khác với phép cộng, yêu cầu kiểm tra bổ sung về các số trước khi chúng có thể được thêm vào. Vì bạn muốn các thao tác cơ bản nhất (cộng, trừ, v.v.) càng nhanh càng tốt, bạn cần lưu trữ các số theo cách cho phép bạn sử dụng các thuật toán đơn giản nhất có thể.

Ngoài ra, trong phương thức lưu trữ "trực quan", có hai số không:

0000  "zero"
1000  "negative zero"

Đó là trực giác cùng một số nhưng có hai giá trị khác nhau khi được lưu trữ. Mỗi ứng dụng sẽ cần thực hiện các bước bổ sung để đảm bảo rằng các giá trị khác không cũng không âm 0.

Có một phần thưởng khác với việc lưu trữ int theo cách này và đó là khi bạn cần mở rộng độ rộng của thanh ghi, giá trị đang được lưu trữ. Với hai phần bù, lưu trữ số 4 bit trong thanh ghi 8 bit là vấn đề lặp lại điều ý nghĩa nhất:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1110 (negative two, in four bits)
11111110 (negative two, in eight bits)

Đó chỉ là vấn đề nhìn vào bit dấu của từ nhỏ hơn và lặp lại cho đến khi nó đệm chiều rộng của từ lớn hơn.

Với phương thức của bạn, bạn sẽ cần xóa bit hiện có, đây là thao tác bổ sung ngoài phần đệm:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1010 (negative two, in four bits)
10000010 (negative two, in eight bits)

Bạn vẫn cần đặt thêm 4 bit đó trong cả hai trường hợp, nhưng trong trường hợp "trực quan", bạn cũng cần phải xóa bit thứ 5. Đây là một bước bổ sung nhỏ trong một trong những hoạt động cơ bản và phổ biến nhất có trong mọi ứng dụng.


13
Tôi đồng ý. Công trình bổ sung của 2. Nhưng làm thế nào chúng ta đến được nó ở nơi đầu tiên? Nếu giả sử tôi cần đến ký hiệu này, quá trình suy nghĩ sẽ là gì. Tôi nghĩ rằng đến phần bổ sung của 2 không chỉ là may mắn, phải không?
Lazer

1
Ngoài ra, tại sao không có đối tác bổ sung của 2 cho phao?
Lazer

6
@Lazer kiểm tra bài viết này để biết how we arrived at 2s compliment the first place. cs.cornell.edu/~tomf/notes/cps104/twoscomp.html
Ankit

1
Java chỉ đã ký các kiểu số nguyên theo như tôi biết, vì vậy nó luôn xử lý nó theo cách hiểu bổ sung của hai. Trong các ngôn ngữ khác, cách xử lý giá trị phụ thuộc vào cách mã xử lý nó. Không có gì để nói với bạn rằng một khối bộ nhớ là một số nguyên có dấu hoặc không dấu hoặc một chuỗi hoặc một chuỗi hoặc một cái gì đó khác. Dữ liệu thô là bất cứ loại nào bạn chọn để giải thích nó.
Welbog

3
@Suraj, tôi khuyên bạn nên xem bài viết trên Wikipedia về phần bổ sung của hai để có câu trả lời đầy đủ: en.wikipedia.org/wiki/Two%27s_compuity . Câu trả lời ngắn gọn là MSB 1chỉ -8, và số còn lại ba 1s chỉ ra 4, 21, tương ứng, vì vậy -8+4+2+1 = -1.
Welbog

18

Wikipedia nói lên tất cả:

Hệ thống bổ sung của hai có ưu điểm là không yêu cầu mạch cộng và trừ kiểm tra các dấu của toán hạng để xác định xem nên cộng hay trừ. Thuộc tính này làm cho hệ thống vừa đơn giản hơn để thực hiện và có khả năng dễ dàng xử lý số học chính xác cao hơn. Ngoài ra, số không chỉ có một đại diện duy nhất, làm mờ đi sự tinh tế liên quan đến số 0 âm, tồn tại trong các hệ thống bổ sung.

Nói cách khác, việc thêm là như nhau, số hay không là số âm.


Thưa ông, nếu tôi viết char a = 12; và unsign char b = 12, bit bên dưới có giống nhau không, điều gì thực sự xảy ra?
Suraj Jain

Không có gì thay đổi khi viết hoặc đọc. Chỉ áp dụng khi cộng hoặc trừ.
Talespin_Kit

12

Mặc dù câu hỏi này đã cũ, hãy để tôi đặt 2 xu của tôi.

Trước khi tôi giải thích điều này, hãy quay trở lại vấn đề cơ bản. Bổ sung 2 'là bổ sung 1 + + 1. Bây giờ bổ sung của 1 là gì và ngoài ra tầm quan trọng của nó là gì.

Tổng của bất kỳ số n bit nào và phần bù 1 của nó cung cấp cho bạn số cao nhất có thể được biểu thị bằng các bit n đó. Thí dụ:

 0010 (2 in 4 bit system)
+1101 (1's complement of 2)
___________________________
 1111  (the highest number that we can represent by 4 bits)

Bây giờ điều gì sẽ xảy ra nếu chúng ta cố gắng thêm 1 kết quả nữa. Nó sẽ dẫn đến một tràn.

Kết quả sẽ 1 0000là 0 (vì chúng tôi đang làm việc với các số 4 bit, (số 1 bên trái là tràn)

Vì thế ,

Any n-bit number + its 1's complement = max n-bit number
Any n-bit number + its 1'complement + 1 = 0 ( as explained above, overflow will occur as we are adding 1 to max n-bit number)

Sau đó, một số người đã quyết định gọi phần bổ sung của 1 + 1 là phần bổ sung. Vì vậy, câu lệnh trên trở thành: Bất kỳ số n'bit + phần bù 2 của nó = 0 có nghĩa là phần bù 2 của một số = - (của số đó)

Tất cả điều này mang lại thêm một câu hỏi, tại sao chúng ta chỉ có thể sử dụng (n-1) của n bit để biểu thị số dương và tại sao bit thứ n bên trái nhất biểu thị (0 trên bit ngoài cùng bên trái có nghĩa là + số ve và 1 có nghĩa là -có số). ví dụ: tại sao chúng ta chỉ sử dụng 31 bit đầu tiên của int trong java để biểu thị số dương nếu bit thứ 32 là 1, số -ve của nó.

 1100 (lets assume 12 in 4 bit system)
+0100(2's complement of 12)
___________________________

1 0000 (kết quả bằng 0, với số 1 mang theo)

Do đó, hệ thống của (n + 2'compuity của n) = 0, vẫn hoạt động. Sự mơ hồ duy nhất ở đây là phần bù 12 của 2 là 0100, mơ hồ cũng đại diện cho +8, ngoài việc đại diện cho -12 trong hệ thống bổ sung 2 giây.

Vấn đề này sẽ được giải quyết nếu các số dương luôn có 0 ở bên trái hầu hết bit của chúng. Trong trường hợp đó, phần bù 2 của chúng sẽ luôn có 1 trong phần lớn bên trái của chúng và chúng ta sẽ không có sự mơ hồ của cùng một tập hợp bit đại diện cho số bù 2 cũng như số + ve.


1
+ 1'ed. Đó là thông tin, tuy nhiên cuối cùng tôi không chắc tại sao bạn muốn có cách tiếp cận bit quan trọng nhất để đại diện cho dù đó là số dương hay số âm. Nó có nhiều vấn đề như 0 sẽ có 2 biểu diễn - 0000 (+) và 1000 (-) .. Ngoài ra, phép cộng và phép trừ không thể được thực hiện bằng cùng một thuật toán. Khi bạn nói 0100 bình thường thì đó là +8 và khi bạn nói hai bổ sung 0100 thì đó là -12 ..
hagrawal

8

Phần bù của hai cho phép phép cộng và phép trừ được thực hiện theo cách thông thường (như bạn xử lý các số không dấu). Nó cũng ngăn -0 (một cách riêng để biểu thị 0 sẽ không bằng 0 với phương pháp so sánh số bit thông thường).


6

điều này là để đơn giản hóa các khoản tiền và sự khác biệt của các con số. tổng của một số âm và một số dương được mã hóa trong phần bổ sung của 2 cũng giống như tính tổng chúng theo cách thông thường.


5

Cách thực hiện thông thường của thao tác là "lật các bit và thêm 1", nhưng có một cách khác để xác định nó có thể làm cho lý do rõ ràng hơn. Bổ sung của 2 là hình thức bạn nhận được nếu bạn sử dụng biểu diễn không dấu thông thường trong đó mỗi bit kiểm soát sức mạnh tiếp theo của 2 và chỉ làm cho thuật ngữ có ý nghĩa tiêu cực nhất.

Lấy giá trị 8 bit a 7 a 6 a 5 a 4 a 3 a 2 a 1 a 0

Giải thích nhị phân không dấu thông thường là:
2 7 * a 7 + 2 6 * a 6 + 2 5 * a 5 + 2 4 * a 4 + 2 3 * a 3 + 2 2 * a 2 + 2 1 * a 1 + 2 0 * a 0
11111111 = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255

Giải thích bổ sung của hai là:
-2 7 * a 7 + 2 6 * a 6 + 2 5 * a 5 + 2 4 * a 4 + 2 3 * a 3 + 2 2 * a 2 + 2 1 * a 1 + 2 0 * a 0
11111111 = -128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1

Không có bit nào khác thay đổi ý nghĩa cả, và mang vào số 7 là "tràn" và dự kiến ​​sẽ không hoạt động, do đó, hầu như tất cả các phép toán số học đều hoạt động mà không sửa đổi (như những người khác đã lưu ý). Độ lớn ký hiệu thường kiểm tra bit dấu và sử dụng logic khác nhau.


4

Phần bù của hai cho phép các số âm và dương được cộng lại với nhau mà không có logic đặc biệt nào.

Nếu bạn đã cố thêm 1 và -1 bằng phương pháp
10000001 (-1)
+00000001 (1),
bạn sẽ nhận được
10000010 (-2)

Thay vào đó, bằng cách sử dụng bổ sung của hai, chúng ta có thể thêm

11111111 (-1)
+00000001 (1) bạn nhận được
00000000 (0)

Điều này cũng đúng với phép trừ.

Ngoài ra, nếu bạn cố gắng trừ 4 từ 6 (hai số dương), bạn có thể 2 bù 4 và cộng hai số lại với nhau 6 + (-4) = 6 - 4 = 2

Điều này có nghĩa là phép trừ và cộng cả số dương và số âm đều có thể được thực hiện bởi cùng một mạch trong cpu.


4

Để mở rộng câu trả lời cho người khác:

Trong hai bổ sung

  • Thêm là cơ chế tương tự như số nguyên dương tích cực thêm.
  • Trừ đi cũng không thay đổi
  • Nhân giống quá!

Bộ phận đòi hỏi một cơ chế khác nhau.

Tất cả những điều này là đúng bởi vì phần bù của hai chỉ là số học mô-đun thông thường, trong đó chúng tôi chọn xem một số số là âm bằng cách trừ modulo.


Không chỉ có phép nhân không mở rộng là như nhau . Nhưng vì hầu hết các ngôn ngữ cấp cao không hỗ trợ nhân rộng mà không cần truyền rõ ràng, kết quả sẽ giống nhau trong các ngôn ngữ đó.
phuclv

@ LưuViênPhúc: Nhân rộng mở rộng thường sẽ giống nhau, nhưng kết quả cho phép nhân có dấu và không dấu chỉ được đảm bảo giống nhau nếu kết quả phù hợp với phạm vi của một số nguyên đã ký. Một số trình biên dịch như gcc, được cung cấp một cái gì đó như unsigned mul(unsigned short x, unsigned short y) { return x*y; }[ngắn 16 bit; Int 32 bit đôi khi sẽ tạo mã sẽ gặp trục trặc nếu sản phẩm lớn hơn 2147483647.
supercat

2

Đọc câu trả lời cho câu hỏi này, tôi đã xem qua nhận xét này [đã chỉnh sửa].

Bổ sung của 2 là 0100 (4) sẽ là 1100. Bây giờ 1100 là 12 nếu tôi nói bình thường. Vì vậy, khi tôi nói 1100 bình thường thì nó là 12, nhưng khi tôi nói 2 bù 1100 thì nó là -4? Ngoài ra, trong Java khi 1100 (giả sử 4 bit bây giờ) được lưu trữ thì nó được xác định như thế nào nếu nó là +12 hoặc -4 ?? - hagrawal ngày 2 tháng 7 lúc 16:53

Theo tôi, câu hỏi được hỏi trong bình luận này khá thú vị và vì vậy trước tiên tôi muốn viết lại nó và sau đó đưa ra câu trả lời và một ví dụ.

CÂU HỎI - Làm thế nào hệ thống có thể thiết lập làm thế nào một hoặc nhiều byte liền kề phải được giải thích? Cụ thể, làm thế nào hệ thống có thể thiết lập liệu một chuỗi byte nhất định là số nhị phân đơn giản hay số bù 2?

TRẢ LỜI - Hệ thống thiết lập cách diễn giải chuỗi byte thông qua các loại. Các loại định nghĩa

  • có bao nhiêu byte phải được xem xét
  • làm thế nào những byte đó phải được giải thích

VÍ DỤ - Dưới đây chúng tôi giả định rằng

  • chardài 1 byte
  • shortdài 2 byte
  • int's và float' dài 4 byte

Xin lưu ý rằng các kích thước này là dành riêng cho hệ thống của tôi. Mặc dù khá phổ biến, chúng có thể khác nhau từ hệ thống này sang hệ thống khác. Nếu bạn tò mò về những gì họ có trên hệ thống của bạn, hãy sử dụng toán tử sizeof .

Trước hết, chúng tôi xác định một mảng chứa 4 byte và khởi tạo tất cả chúng thành số nhị phân 10111101, tương ứng với số thập lục phân BD.

// BD(hexadecimal) = 10111101 (binary)
unsigned char   l_Just4Bytes[ 4 ]   =   { 0xBD, 0xBD, 0xBD, 0xBD };

Sau đó chúng tôi đọc nội dung mảng bằng các loại khác nhau.

unsigned charsigned char

// 10111101 as a PLAIN BINARY number equals 189
printf( "l_Just4Bytes as unsigned char  -> %hi\n", *( ( unsigned char* )l_Just4Bytes ) );

// 10111101 as a 2'S COMPLEMENT number equals -67
printf( "l_Just4Bytes as signed char    -> %i\n", *( ( signed char* )l_Just4Bytes ) );

unsigned shortshort

// 1011110110111101 as a PLAIN BINARY number equals 48573
printf( "l_Just4Bytes as unsigned short -> %hu\n", *( ( unsigned short* )l_Just4Bytes ) );

// 1011110110111101 as a 2'S COMPLEMENT number equals -16963
printf( "l_Just4Bytes as short          -> %hi\n", *( ( short* )l_Just4Bytes ) );

unsigned int, intfloat

// 10111101101111011011110110111101 as a PLAIN BINARY number equals 3183328701
printf( "l_Just4Bytes as unsigned int   -> %u\n", *( ( unsigned int* )l_Just4Bytes ) );

// 10111101101111011011110110111101 as a 2'S COMPLEMENT number equals -1111638595
printf( "l_Just4Bytes as int            -> %i\n", *( ( int* )l_Just4Bytes ) );

// 10111101101111011011110110111101 as a IEEE 754 SINGLE-PRECISION number equals -0.092647
printf( "l_Just4Bytes as float          -> %f\n", *( ( float* )l_Just4Bytes ) );

4 byte trong RAM ( l_Just4Bytes[ 0..3 ]) luôn giữ nguyên chính xác. Điều duy nhất thay đổi là cách chúng ta diễn giải chúng.

Một lần nữa, chúng tôi nói với hệ thống làm thế nào để giải thích chúng thông qua các loại .

Ví dụ, ở trên chúng tôi đã sử dụng các loại sau để diễn giải nội dung của l_Just4Bytesmảng

  • unsigned char: 1 byte ở dạng nhị phân đơn giản
  • signed char: 1 byte trong phần bù của 2
  • unsigned short: 2 byte trong ký hiệu nhị phân đơn giản
  • short: 2 byte bổ sung cho 2
  • unsigned int: 4 byte trong ký hiệu nhị phân đơn giản
  • int: 4 byte bổ sung cho 2
  • float: 4 byte trong ký hiệu chính xác đơn IEEE 754

[EDIT] Bài đăng này đã được chỉnh sửa sau khi nhận xét bởi người dùng4581602. Cảm ơn bạn đã dành thời gian để bỏ vài dòng hữu ích!


Blob code đó cần chỉnh sửa để người đọc không phải tiếp tục cuộn qua lại. Tốt hơn, nhận xét lớn đó ở trên cùng sẽ trở thành văn bản cũ đơn giản và để trình kết xuất xử lý định dạng. Bạn cũng nên thêm một cảnh báo vào bit gần cuối nơi bạn thảo luận về kích thước và định dạng vì kích thước không cố định.
dùng4581602

+1. Một điều bạn có thể cân nhắc thực hiện, @ mw215, là tự mình đặt câu hỏi / câu trả lời này thành một mục nhập Community Wiki, bởi vì nó hữu ích cho những người có thể quan tâm đến việc giải thích byte thô bên ngoài bối cảnh của toán học bổ trợ hai.
Welbog

Tôi chỉ muốn biết là bổ sung của 2 luôn theo sau, ý tôi là nếu tôi có int x = -4, và sau đó tôi làm printf("%d" , x)thế nào để nó được giải thích? Ngoài ra sự khác biệt giữa là những gì unsigned intsigned int%d%u... này đã được bugging tôi trong một thời gian dài bây giờ .Thanks.
Suraj Jain

@Suraj Jain Khi sử dụng intcác loại, công cụ signedsửa đổi là mặc định. Điều này có nghĩa là intsigned intchính xác cùng loại. Do đó, hai định nghĩa int i = -4;signed int i = -4;có cùng một ý nghĩa.
mw215

@Suraj Jain Hệ thống thiết lập cách diễn giải một chuỗi byte thông qua các loại. Các kiểu định nghĩa: có bao nhiêu byte phải được xem xét và cách các byte đó phải được giải thích. An intlà 4 byte trong phần bù của 2 và an unsigned intlà 4 byte trong ký hiệu nhị phân đơn giản (kiểm tra kích thước loại thực tế trên hệ thống của bạn bằng sizeoftoán tử).
mw215

1

Bạn có thể xem Giáo sư Jerry Cain từ Stanford giải thích về phần bổ sung của hai người, trong bài giảng thứ hai (phần giải thích về phần bổ sung của 2 bắt đầu vào khoảng 13:00) trong loạt bài giảng có tên là Paradigms Lập trình có sẵn để xem từ kênh YouTube của Standford. Đây là liên kết đến chuỗi bài giảng: http://www.youtube.com/view_play_list?p=9D558D49CA734A02 .


0

Bổ sung của hai được sử dụng bởi vì nó đơn giản hơn để thực hiện trong mạch và cũng không cho phép số 0 âm.

Nếu có x bit, phần bù của hai sẽ nằm trong khoảng từ + (2 ^ x / 2 + 1) đến - (2 ^ x / 2). Phần bù của một người sẽ chạy từ + (2 ^ x / 2) đến - (2 ^ x / 2), nhưng sẽ cho phép số 0 âm (0000 bằng 1000 trong hệ thống bổ sung 4 bit 1).


0

Chà, ý định của bạn không thực sự là đảo ngược tất cả các bit của số nhị phân của bạn. Nó thực sự là để trừ mỗi chữ số của nó từ 1. Đó chỉ là một sự trùng hợp may mắn khi trừ 1 từ 1 kết quả bằng 0 và trừ 0 từ 1 kết quả trong 1. Vì vậy, việc lật các bit thực hiện phép trừ này một cách hiệu quả.

Nhưng tại sao bạn lại tìm thấy sự khác biệt của mỗi chữ số từ 1? Chà, bạn thì không. Mục đích thực tế của bạn là tính toán sự khác biệt của số nhị phân đã cho từ một số nhị phân khác có cùng số chữ số nhưng chỉ chứa 1 số. Ví dụ: nếu số của bạn là 10110001, khi bạn lật tất cả các bit đó, bạn đang tính toán hiệu quả (11111111 - 10110001).

Điều này giải thích bước đầu tiên trong tính toán Bổ sung của Hai. Bây giờ hãy bao gồm bước thứ hai - thêm 1 - cũng trong hình.

Thêm 1 vào phương trình nhị phân trên:

11111111 - 10110001 + 1

Bạn được những gì? Điều này:

100000000 - 10110001

Đây là phương trình cuối cùng. Và bằng cách thực hiện hai bước mà bạn đang cố gắng tìm ra điều này, điểm khác biệt cuối cùng: số nhị phân được trừ từ một số nhị phân khác có thêm một chữ số và chứa các số 0 trừ ở vị trí bit có nghĩa nhất.

Nhưng tại sao chúng ta lại khao khát sự khác biệt này? Chà, từ đây trở đi, tôi đoán sẽ tốt hơn nếu bạn đọc bài viết trên Wikipedia .


0

Chúng tôi chỉ thực hiện thao tác cộng cho cả phép cộng và phép trừ. Chúng ta thêm toán hạng thứ hai vào toán hạng thứ nhất để thêm vào. Để trừ, chúng ta thêm phần bù 2 của toán hạng thứ hai vào toán hạng thứ nhất.

Với biểu diễn phần bù 2, chúng ta không cần các thành phần kỹ thuật số riêng biệt để trừ trừ chỉ sử dụng các phần bổ trợ và phần bổ trợ.


0

Đáng lưu ý rằng trên một số máy bổ sung sớm, trước thời của máy tính kỹ thuật số, phép trừ sẽ được thực hiện bằng cách cho người vận hành nhập các giá trị bằng cách sử dụng một tập hợp các huyền thoại có màu khác nhau trên mỗi phím (vì vậy mỗi khóa sẽ nhập chín trừ đi số bị trừ) và nhấn một nút đặc biệt sẽ giả sử thực hiện tính toán. Do đó, trên máy sáu chữ số, để trừ 1234 khỏi một giá trị, toán tử sẽ nhấn các phím thường chỉ "998.765" và nhấn một nút để thêm giá trị đó cộng với một vào tính toán đang diễn ra. Số học bổ sung của hai chỉ đơn giản là tương đương nhị phân của số học "bổ sung mười" trước đó.


0

Ưu điểm của việc thực hiện phép trừ bằng phương pháp bổ sung là giảm
độ phức tạp phần cứng. Không cần các mạch kỹ thuật số khác nhau để cộng và trừ. Việc cộng và trừ chỉ được thực hiện bởi trình cộng.


0

Một lợi thế lớn của biểu diễn phần bù hai chưa được đề cập ở đây là các bit thấp hơn của tổng, phần tử hoặc sản phẩm bổ sung của hai phần phụ thuộc chỉ phụ thuộc vào các bit tương ứng của toán hạng. Lý do giá trị được ký 8 bit cho -1 là 11111111vì trừ đi bất kỳ số nguyên nào có 8 bit thấp nhất 00000001từ bất kỳ số nguyên nào khác có 8 bit thấp nhất 0000000sẽ mang lại một số nguyên có 8 bit thấp nhất11111111. Về mặt toán học, giá trị -1 sẽ là một chuỗi vô hạn 1, nhưng tất cả các giá trị trong phạm vi của một loại số nguyên cụ thể sẽ là tất cả 1 hoặc tất cả 0 qua một điểm nhất định, vì vậy thuận tiện cho máy tính "mở rộng đăng nhập" bit quan trọng nhất của một số như thể nó đại diện cho số lượng vô hạn là 1 hoặc 0.

Phần bù của hai chỉ là đại diện cho số có chữ ký duy nhất hoạt động tốt khi xử lý các loại lớn hơn kích thước từ tự nhiên của máy nhị phân, vì khi thực hiện phép cộng hoặc phép trừ, mã có thể tìm nạp đoạn thấp nhất của mỗi toán hạng, tính toán đoạn thấp nhất của kết quả và lưu trữ, sau đó tải đoạn tiếp theo của mỗi toán hạng, tính toán đoạn tiếp theo của kết quả và lưu trữ, v.v. Do đó, ngay cả một bộ xử lý yêu cầu tất cả các phép cộng và phép trừ phải đi qua một thanh ghi 8 bit duy nhất tất nhiên có thể xử lý các số được ký 32 bit một cách hợp lý hiệu quả (chậm hơn so với thanh ghi 32 bit, tất nhiên, nhưng vẫn hoạt động được).

Khi sử dụng bất kỳ biểu diễn có chữ ký nào khác được cho phép bởi Tiêu chuẩn C, mọi bit của kết quả có thể có khả năng bị ảnh hưởng bởi bất kỳ bit nào của toán hạng, do đó cần phải giữ toàn bộ giá trị trong các thanh ghi một lần hoặc nếu không thì phải tính toán thêm trong một số trường hợp, trong một số trường hợp, sẽ yêu cầu đọc, sửa đổi và viết lại từng đoạn của kết quả.


Vui lòng định dạng câu trả lời của bạn trong đoạn văn và đánh dấu mã dưới dạng mã, nó sẽ dễ đọc hơn và bạn sẽ nhận được upvote.
Suraj Jain

@SurajJain: Điều đó có tốt hơn không?
supercat

Vâng, tốt hơn so với những gì trước đó, tôi muốn hỏi bạn một điều khác biệt giữa ký char a = 1 và ký tự không dấu a = 1, chúng được biểu diễn như thế nào trong bộ nhớ.
Suraj Jain

@SurajJain: Trên hai hệ thống bổ sung có "char" nhỏ hơn "int" [nghĩa là phần lớn các hệ thống], các loại char đã ký và không dấu sẽ hoạt động giống hệt nhau ngoại trừ các loại đã ký sẽ được mở rộng khi đọc và loại không dấu sẽ không Trên một hệ thống như vậy, việc lưu trữ giá trị 194 hoặc -62 vào một char đã ký sẽ ghi cùng một mẫu bit như lưu trữ 194 hoặc -62 vào một char không dấu (tức là 11000010). Đọc mẫu bit đó từ một char đã ký sẽ mang lại -62 và đọc nó từ một char không dấu sẽ mang lại 194.
supercat

phương tiện gia hạn?
Suraj Jain

0

Có nhiều loại biểu diễn khác nhau đó là:

  1. đại diện số không dấu
  2. đại diện số đã ký
  3. đại diện bổ sung của một
  4. Đại diện bổ sung của hai

Biểu diễn số được chỉ định được sử dụng để chỉ đại diện cho các số dương

Đại diện số -Sign được sử dụng để đại diện cho số dương cũng như số âm. Trong biểu diễn số đã ký Bit bit MSB đại diện cho bit dấu và bit còn lại đại diện cho số. Khi MSB bằng 0 có nghĩa là số dương và Khi MSB là 1 có nghĩa là số âm.

Vấn đề với biểu diễn số đã ký là có hai giá trị cho 0.

Vấn đề với biểu diễn bổ sung của một người là có hai giá trị cho 0.

Nhưng nếu chúng ta sử dụng biểu diễn bổ sung của Two thì sẽ chỉ có một giá trị cho 0 đó là lý do tại sao chúng ta biểu diễn các số âm ở dạng bổ sung của hai.

Nguồn: Tại sao số âm được lưu trữ ở dạng bổ sung byteofgigabyte của hai


-1

Một câu trả lời thỏa đáng về lý do tại sao Bổ sung của Two2 được sử dụng để biểu thị các số âm thay vì hệ thống Bổ sung của One là hệ thống Bổ sung của Two giải quyết vấn đề nhiều biểu diễn bằng 0 và nhu cầu mang theo kết thúc tồn tại trong hệ thống bổ sung của One thể hiện tiêu cực số.

Để biết thêm thông tin Truy cập https://en.wikipedia.org/wiki/Sign_number_Vpresentations

Để kết thúc chuyến đi, hãy truy cập https://en.wikipedia.org/wiki/End-around_carry


trên thực tế, nếu bạn có một dấu thập phân và rõ ràng về tất cả các bit là gì: "0..0000.1111..1" có nghĩa là tất cả các bit không được nói nhiều nhất là 0, và tất cả các bit không được nói đúng nhất là 1, và do đó "..1" có nghĩa là một carry được kích hoạt. Do đó, nó (về mặt cơ học) "0,0001.0000..0". Điều đó có nghĩa là "1..1111.1111..1" bằng 0! Điều này cũng có nghĩa là để phủ định một số nguyên, bạn thực sự chỉ cần lật các bit của nó. Nhưng bây giờ nó áp dụng cho các phân số đại diện.
Cướp
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.