مکمل یک (One’s Complement) و مکمل دو (Two’s Complement)

مکمل یک و مکمل دو روش‌هایی برای ذخیره و نمایش اعداد صحیح علامت‌دار در کامپیوتر هستند. مکمل ۱ یک عدد دودویی (در مبنای ۲ یا باینری) را می‌توان با صفر کردن تمام یک‌ها و یک کردن تمام صفرها بدست آورد. برای بدست آوردن مکمل ۲ هم باید یک‌ها را به صفر و صفرها را به یک تبدیل کنیم و سپس عدد حاصل را با عدد یک جمع کنیم.

فرض کنید اعداد در یک عدد صحیح ۸ بیتی (Eight-bit signed integers) ذخیره می‌شود (مانند دادهٔ char در زبان C):

BitsOne’s Complement RepresentationUnsigned ValueOne’s Complement
0000 0000001111 1111
0000 0001111111 1110
0000 0010221111 1101
0111 11101261261000 0001
0111 11111271271000 0000
1000 0000-1271280111 1111
1000 0001-1261290111 1110
1000 0010-1251300111 1101
1111 1101-22530000 0010
1111 1110-12540000 0001
1111 1111-02550000 0000
BitsTwo’s Complement RepresentationUnsigned ValueTwo’s Complement
0000 0000000000 0000
0000 0001111111 1111
0000 0010221111 1110
0111 11101261261000 0010
0111 11111271271000 0001
1000 0000-1281281000 0000
1000 0001-1271290111 1111
1000 0010-1261300111 1110
1111 1101-32530000 0011
1111 1110-22540000 0010
1111 1111-12550000 0001

نکته ۱:

1000 0000 = -127 (در نمایش مکمل یک)
1000 0000 = -128 (در نمایش مکمل دو)

نکته ۲: بیتی که در سمت چپ قرار دارد (MSB یا high-order bit)، علامت عدد را نشان می‌دهد و مابقی این ارقام بزرگی این عدد را نشان می‌دهند.

همانطور که در جدول اول می‌بینید، در مکمل یک برای عدد صفر دو حالت داریم: ۱. صفر مثبت: زمانی که همهٔ بیت‌ها برابر صفر (0) باشد ۲. صفر منفی: زمانی که همهٔ بیت‌ها برابر یک (1) باشد. اما این مورد در مکمل دو وجود ندارد. بدلیل وجود مشکلاتی در جمع و تفریق و وجود دو صفر مثبت و منفی باعث شد که مکمل دو کم‌کم جایگزین مکمل یک شود.

فرض کنید اعداد در یک عدد صحیح ۳ بیتی (Three-bit signed integers) ذخیره می‌شود:

BitsOne’s Complement RepresentationTwo’s Complement RepresentationUnsigned Value
000000
001111
010222
011333
100-3-44
101-2-35
110-1-26
111-0-17

نکته واضح در هر سه جدول این است که نمایش (Representation) مکمل یک و مکمل دو در اعداد مثبت با هم تفاوتی ندارد. این تفاوت در اعداد منفی قابل مشاهده است.