補碼10000000為什麼可以表示 128?

時間 2021-05-11 11:29:28

1樓:還沒想好啊

前幾天才想了這個問題,我的理解是這樣的~要是有不對的地方還希望指出

時鐘有12格,乙個指著3點的時針要是想撥到6點,可以選擇順時針撥3,或者逆時針撥9,達到的效果完全一樣,其實就是3和-9對於mod12來說是一樣的,也叫做3和-9同餘。那麼對於8位二進位制數,模的數就變為2^8=256,所以-1和255是同餘的,-2和254同餘,-128和128同餘。

對於無符號數八位二進位制數可以表示的範圍是0-255,那麼對於有符號數,為了表示負數就需要引入補碼(其實本質是為了在計算機運算時變減法為加法),因為8位二進位制最多只能表示256個數字,那就只能正負一人一半咯。在原碼裡面0有+0和-0之分,而在補碼裡面0是唯一的,只有一種表示,所以原碼的表示範圍為-127~+127,補碼可以多表示一位為-128~+127。

對於正數來說,補碼就是它的原碼。那麼負數該怎麼表示呢,前面提到的同餘的概念,例如-1其實就等價於255,255的原碼表示為11111111,所以-1的補碼為11111111,例如-128其實就等價於+128,+128的原碼為10000000,所以-128的補碼為10000000。可以發現,所有負數等價的正數範圍是從+128~+255的,所以整個補碼表示的-128~+127中,沒有重複的數字表示,其實可以利用離散數學裡面的等價類來理解。

值得注意的是,0-127的二進位制表示是從00000000-01111111,全都是0開頭的,所以0是代表正數的符號位,而-128~-1的補碼表示為10000000-11111111,全是1開頭的,所以1是代表負數的符號位。

看乙個例子,例如54-32,利用補碼運算可以轉化成加法,看成54+(-32),54補碼即原碼00110110,-32等價於+224,224的原碼為11100000,所以54+(-32)等價於00110110+11100000=00010110,即十進位制的22,這與我們十進位制的運算結果一致。

2樓:Thirring

更新01--2020.9.20

從二進位制的角度談,其實二進位制自帶模的性質。以儲存單位——位元組,8位二進位制為例。

(255)1111 1111+(1)0000 0001=0000 0000 因為會出現溢位。所以就是等效為模256;256=0

又因為計算機只能算加法,所以在處理減法時只能用等效的方法。

如:2-1=1 = 2+(256-1) = 2+255=1

回到只能做加法的二進位制,對於計算機2-1是這樣算的:

(2)0000 0010+(255)1111 1111=0000 0001 (出現溢位)

所以利用溢位做了個等效,而此處1111 1111 與-1等效,為了方便理解便把1111 1111 稱為-1的補碼。這也解釋了,正值補碼為什麼就是自身;因為補碼對於計算機其實都是正值。

補碼是相對於人類而言的,計算機還是只做加法。人類認為的2-1,計算機做起來就是2+255。

在讀了這個問題下的兩個回答後,我對補碼有了更深入的理解。但是現存的答案不夠通俗,所以嘗試寫乙個簡單易懂的回答。

首先談幾個概念相關的東西。

1.計算機只能做加法。

這個情況下才催生出補碼來解決減法問題。

2.模概念相關。

具象化理解就是時鐘,12過後就是1。是乙個數的迴圈。

比如,11+2 得 1。那麼,6-1=6+(12-1)=5。

由此,減法變成了加法。

3.溢位

乙個位元組8位1111 1111 加1 會出現溢位,結果只有0000 0000。

那麼回到我們的-128;現在忘掉原、反、補碼的概念。我們來解決2-1。套用上面的套路:

在模是256時:

2-1=2+(256-1)=2+255=1

二進位制:

2:0000 0010 255:1111 1111

這時會發現-1補碼也是1111 1111

那-128=0-128=0+(256-128)=128

二進位制:

128:1000 0000

所以-128的補碼就是1000 0000

那呼之欲出乙個問題:為什麼模是256?

其實我們關於-128的問題應該反過來問,為什麼-128可以是1000 0000?因為-128還可以是

1 1000 0000(模為512時)。

所以,模是多少取決於你想得到的補碼位數。

3樓:南中國海的一條魚

補碼的值依賴於儲存位,如果是目前主流的C/C++編譯器(例如VS的C/C++編譯器,gcc/g++,clang)那麼對於int型別的-128,它的補碼絕對不是10000000,-128的int型別補碼,也就是32位補碼,是0xFFFFFF80.這看起來比較正常,那麼題主的問題就會變成,為什麼int型別(32位整數)的補碼,是0x80000000呢?

其實也很簡單,我們要回歸「補碼」的「補」字的含義上,為了便於計算,負整數在計算機記憶體中都是用補碼來表示的。而補碼補的就是負數絕對值和 ( 是儲存位數)之間的差量。也可以這樣理解,為了便於表示負數,從而實現兩個相反數相加等於 ,一種可行的方法就是造成高位溢位,這樣在計算機中,8位的256和0就相等了。

8位 對應的補碼是

或8位 對應的補碼是或

4樓:

鐘錶時針如果轉一圈會回到原來的位置.

二進位制如果只看最低的8位,乙個數加上256則還是原來的那個數.

鐘錶如果想要減一小時,要麼時針回撥1小時,要麼往前撥11小時.

(回撥1小時 = 加上 12-1 小時)

二進位制如果只看最低的8位,乙個數 -1,可以理解為加上 (256-1)的數.

乙個數 -128,可以理解為加上(256-128)的數.也就是128.

所以用 128 (10000000) 來表示 -128.

換句話說:乙個數的二進位制補碼,就是這個數模256的同餘數.

-1模256=255;255模256=255,所以-1就用255來表示

-128模256=128,128模256也等於128,所以-128就用128來表示

5樓:實名的機靈漢堡寶

字長為8位,它的模為256,負數的補碼為模與該負數絕對值的差值,則-128等於256-128=128,所以它的補碼為10000000。

6樓:科比

在8位進製中,0等於+0和-0、同時可以用

0000 0000和1000 0000表示,這很奢侈,但對於-128就很特別,資料溢位了,計算機語言中也就把10000 0000表示為十進位制中的-128.

同樣的,如果是四位二進位制,-8也可以用1000來表示,說白了就是人為定義了.

7樓:祥先生

可以參考下這篇回答,https://www.

8樓:Tig3r

其實計算機一開始用的就是補碼,沒用原碼,補碼的最高位要填負號,其他正號。10000000就是-128+0+0.......你也可以用其他數試試。

9樓:趙德順

八位有符號整數碼表,清晰直觀

-1<--->11111111

-2<--->11111110

-3<--->11111101

-4<--->11111100

-5<--->11111011

-6<--->11111010

-7<--->11111001

-8<--->11111000

-9<--->11110111

-10<--->11110110

-11<--->11110101

-12<--->11110100

-13<--->11110011

-14<--->11110010

-15<--->11110001

-16<--->11110000

-17<--->11101111

-18<--->11101110

-19<--->11101101

-20<--->11101100

-21<--->11101011

-22<--->11101010

-23<--->11101001

-24<--->11101000

-25<--->11100111

-26<--->11100110

-27<--->11100101

-28<--->11100100

-29<--->11100011

-30<--->11100010

-31<--->11100001

-32<--->11100000

-33<--->11011111

-34<--->11011110

-35<--->11011101

-36<--->11011100

-37<--->11011011

-38<--->11011010

-39<--->11011001

-40<--->11011000

-41<--->11010111

-42<--->11010110

-43<--->11010101

-44<--->11010100

-45<--->11010011

-46<--->11010010

-47<--->11010001

-48<--->11010000

-49<--->11001111

-50<--->11001110

-51<--->11001101

-52<--->11001100

-53<--->11001011

-54<--->11001010

-55<--->11001001

-56<--->11001000

-57<--->11000111

-58<--->11000110

-59<--->11000101

-60<--->11000100

-61<--->11000011

-62<--->11000010

-63<--->11000001

-64<--->11000000

-65<--->10111111

-66<--->10111110

-67<--->10111101

-68<--->10111100

-69<--->10111011

-70<--->10111010

-71<--->10111001

-72<--->10111000

-73<--->10110111

-74<--->10110110

-75<--->10110101

-76<--->10110100

-77<--->10110011

-78<--->10110010

-79<--->10110001

-80<--->10110000

-81<--->10101111

-82<--->10101110

-83<--->10101101

-84<--->10101100

-85<--->10101011

-86<--->10101010

-87<--->10101001

-88<--->10101000

-89<--->10100111

-90<--->10100110

-91<--->10100101

-92<--->10100100

-93<--->10100011

-94<--->10100010

-95<--->10100001

-96<--->10100000

-97<--->10011111

-98<--->10011110

-99<--->10011101

-100<--->10011100

-101<--->10011011

-102<--->10011010

-103<--->10011001

-104<--->10011000

-105<--->10010111

-106<--->10010110

-107<--->10010101

-108<--->10010100

-109<--->10010011

-110<--->10010010

-111<--->10010001

-112<--->10010000

-113<--->10001111

-114<--->10001110

-115<--->10001101

-116<--->10001100

-117<--->10001011

-118<--->10001010

-119<--->10001001

-120<--->10001000

-121<--->10000111

-122<--->10000110

-123<--->10000101

-124<--->10000100

-125<--->10000011

-126<--->10000010

-127<--->10000001

-128<--->10000000 在這裡127<--->01111111

126<--->01111110

125<--->01111101

124<--->01111100

123<--->01111011

122<--->01111010

121<--->01111001

120<--->01111000

119<--->01110111

118<--->01110110

117<--->01110101

116<--->01110100

115<--->01110011

114<--->01110010

113<--->01110001

112<--->01110000

111<--->01101111

110<--->01101110

109<--->01101101

108<--->01101100

107<--->01101011

106<--->01101010

105<--->01101001

104<--->01101000

103<--->01100111

102<--->01100110

101<--->01100101

100<--->01100100

099<--->01100011

098<--->01100010

097<--->01100001

096<--->01100000

095<--->01011111

094<--->01011110

093<--->01011101

092<--->01011100

091<--->01011011

090<--->01011010

089<--->01011001

088<--->01011000

087<--->01010111

086<--->01010110

085<--->01010101

084<--->01010100

083<--->01010011

082<--->01010010

081<--->01010001

080<--->01010000

079<--->01001111

078<--->01001110

077<--->01001101

076<--->01001100

075<--->01001011

074<--->01001010

073<--->01001001

072<--->01001000

071<--->01000111

070<--->01000110

069<--->01000101

068<--->01000100

067<--->01000011

066<--->01000010

065<--->01000001

064<--->01000000

063<--->00111111

062<--->00111110

061<--->00111101

060<--->00111100

059<--->00111011

058<--->00111010

057<--->00111001

056<--->00111000

055<--->00110111

054<--->00110110

053<--->00110101

052<--->00110100

051<--->00110011

050<--->00110010

049<--->00110001

048<--->00110000

047<--->00101111

046<--->00101110

045<--->00101101

044<--->00101100

043<--->00101011

042<--->00101010

041<--->00101001

040<--->00101000

039<--->00100111

038<--->00100110

037<--->00100101

036<--->00100100

035<--->00100011

034<--->00100010

033<--->00100001

032<--->00100000

031<--->00011111

030<--->00011110

029<--->00011101

028<--->00011100

027<--->00011011

026<--->00011010

025<--->00011001

024<--->00011000

023<--->00010111

022<--->00010110

021<--->00010101

020<--->00010100

019<--->00010011

018<--->00010010

017<--->00010001

016<--->00010000

015<--->00001111

014<--->00001110

013<--->00001101

012<--->00001100

011<--->00001011

010<--->00001010

009<--->00001001

008<--->00001000

007<--->00000111

006<--->00000110

005<--->00000101

004<--->00000100

003<--->00000011

002<--->00000010

001<--->00000001

000<--->00000000

為什麼補碼 10000000 的真值是 128

已重置 建議去看一下計算機組成原理,計算機有原碼,補碼和反碼三種,原碼和反碼是不能表示 128的,補碼可以表示 128因為 1 127 10000001 原 11111111 原 11111111 補 10000001 補 10000000 補 128 相當於 0 原但是不能由它反推 0的原碼! h...

128的補碼1000 0000,看了很多文章,還是不太懂?

saltarea 不要管原碼,補碼這些名詞。8位二進位制數從0x00到0xff,有256種狀態,能夠對應256個數,如果表示無符號數,就能表示0 255這256個十進位制數。如果表式有符號數,我們用它表示0到128,和 128到 1的數,這有乙個非負非正數0 127個正數,128個負數,二進位制數0...

補碼轉換為原碼,為什麼是先取反再加1?

NaN 首先我們考慮一下負數實際上是什麼。比如8位二進位制數,8位二進位制有256種可能,所以最多可以表示256種數字。如果是無符號的情況,這樣的數字可以表示0到255。那麼256呢?255 1會是什麼情況呢?眾所周知,255的二進位制形式是1111 1111,而256的二進位制形式是1 0000 ...