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 ...