負數二進位制數求補碼的時候符號位怎么辦

2023-02-05 09:40:23 字數 7074 閱讀 1220

1樓:做而論道

按照補碼的定義式,做起來,更容易的。

補碼,有個定義式,按照定義求補碼,根本就不涉及原碼、反碼,也沒有什麼符號位。

如果是 8 位二進位制數,補碼的定義式簡化如下:

[x]補 = x ;當 x 大於等於 0 時

[x]補 = 256 - |x| ;當 x 小於 0 時這裡面,根本就沒有符號位。

2樓:匿名使用者

注意補碼的求法,最高位始終是符號位

正數的最高位是符號位0,負數的最高位是符號位1。

對於負數: 補碼==反碼+1.

(可以理解成把相對應的相同絕對值的正數整體取反加1)例如:-1的反碼是 11111110

-1的補碼是反碼加1為11111111

最高位是符號位表示為負值

負數二進位制數求補碼的時候符號位怎麼辦

3樓:魯步凝珍

補碼是指除符號位外,取反再加一

4樓:7zone射手

求二進位制負數的補碼的方法是:先求正數的補碼,之後取反加一即可;而正數不變,正數的原碼反碼補碼是一樣的.

+1:0 00000001,0 00000001,0 00000001。

-1:1 00000001,1 11111110,1 11111111. (符號位用空格隔開以示區別)

5樓:匿名使用者

her feet are pale and frozen.

有符號位的二進位制數,在計算原碼和補碼時那個符號位是始終不變的嗎?

6樓:小cherry丸子吖

對於無符號數而言,沒有什麼原碼、反碼、補碼的概念,只有絕對值。

對於帶符號數,才會有採用什麼碼型來表示的問題。10000000確實是-128的補碼。對於帶符號數,最高位是符號位,0表示正數、1表示負數,始終不變。

所有的碼型換算,都只針對低位的絕對值部分進行。

例如12的原碼是00001100,-12的原碼是10001100。對其絕對值部分0001100求反加1得1110100,最高位添上符號位1,就是補碼11110100。

所以碼型轉換運算只針對絕對值部分,不針對符號位,符號位始終不變。

因為對於帶符號數而言,真正的表示範圍是-127~+127,這其中包含了兩個0:+0(00000000)和-0(10000000)。而實際應用中,0是沒有符號的,所以規定0用+0來表示,那麼-0就是一個沒有用的二進位制碼了,而對於低7位而言,模為128,那麼128與0就是等值的,此時符號位是負的,於是規定-0就表示-128。

這是人為規定。

7樓:沙裡波特

根本就不用費那麼多事。

正數的補碼,就是該數本身。

負數的補碼,就用其正數,減一取反,就成可了。

例如,已知:+9 的補碼是:0000 1001。

求-9 補碼步驟如下:

先減一:0000 1001-1 = 0000 1000。

再取反,即得:-9 補碼 = 1111 0111。

這不就完了嗎?

原碼反碼符號位,這些,都是垃圾。

二進位制補碼怎麼計算的

8樓:guxuecan劍

1、正數的補碼錶示:

正數的補碼 = 原碼

負數的補碼 = +    or

= +

以十進位制整數+97和-97為例:

+97原碼 = 0110_0001b

+97補碼 = 0110_0001b

-97原碼  = 1110_0001b

-97補碼  = 1001_1111b

2、純小數的原碼:

純小數的原碼如何得到呢?方法有很多,在這裡提供一種較為便於筆算的方法。

以0.64為例,通過查閱可知其原碼為0.1010_0011_1101_0111b。

操作方法:

將0.64 * 2^n 得到x,其中n為預保留的小數點後位數(即認為n為小數之後的小數不重要),x為乘法結果的整數部分。

此處將n取16,得

x = 41943d = 1010_0011_1101_0111b

即0.64的二進位制表示在左移了16位後為1010_0011_1101_0111b,因此可以認為0.64d = 0.1010_0011_1101_0111b 與查詢結果一致。

再實驗n取12,得

x = 2621d = 1010_0011_1101b 即 0.64d = 0.1010_0011_1101b,在忽略12位小數之後的位數情況下,計算結果相同。

3、純小數的補碼:

純小數的補碼遵循的規則是:在得到小數的原始碼後,小數點前1位表示符號,從最低(右)位起,找到第一個「1」照寫,之後「見1寫0,見0寫1」。

以-0.64為例,其原碼為1.1010_0011_1101_0111b

則補碼為:1.0101_1100_0010_1001b

當然在硬體語言如verilog中二進位制表示時不可能帶有小數點(事實上不知道**可以帶小數點)。

4、一般帶小數的補碼

一般來說這種情況下先轉為整數運算比較方便

-97.64為例,經查詢其原碼為1110_0001.1010_0011_1101_0111b

筆算過程:

-97.64 * 2^16 = -6398935 = 1110_0001_1010_0011_1101_0111b,其中小數點在右數第16位,與查詢結果一致。

則其補碼為1001_1110_0101_1100_0010_1001b,在此採用 負數的補碼 = +  方法

5、補碼得到原碼:

方法:符號位不動,幅度值取反+1 or符號位不動,幅度值-1取反

-97.64補碼 = 1001_1110(.)0101_1100_0010_1001b

取反      = 1110_0001(.)1010_0011_1101_0110b

+1         = 1110_0001(.)1010_0011_1101_0111b 與查詢結果一致

6、補碼的拓展:

在運算時必要時要對二進位制補碼進行數位拓展,此時應將符號位向前拓展。

-5補碼 = 4'b1011 = 6'b11_1011

ps.原碼的拓展是將符號位提到最前面,然後在拓展位上部0.

-5原碼 = 4『b』1101 = 6'b10_0101,對其求補碼得6'b11_1011,與上文一致。

9樓:center丿

06如何快速的將二進位制轉換成十進位制

10樓:匿名使用者

1、機器數

一個數在計算機中的二進位制表示形式,  叫做這個數的機器數。機器數是帶符號的,在計算機用一個數的最高位存放符號, 正數0,負數為1。12

比如,十進位制中的數 +3 ,計算機字長為8位,轉換成二進位制就是0000 0011。如果是 -3 ,就是 1111 1101 。那麼,這裡的 00000011 和  1111 1101 就是機器數。

機器數包含了符號和數值部分。

2、真值

因為第一位是符號位,所以機器數的形式值就不能很好的表示真正的數值。例如上面的有符號數  1111 1101,其最高位1代表負,其真正數值是

-3 而不是形式值253(1111

1101按無符號整數轉換成十進位制等於253)。所以,為區別起見,將帶符號位的機器數對應的真正數值稱為機器數的真值。

例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –0111 1111 = –127;這裡所說的比如-3二進位制**為10000011,就是我們計算機裡面對-3表示的原始碼。下面介紹原始碼

首先說明一點

在計算機內,有符號數有3種表示法:原碼、反碼和補碼。

3、原碼

原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其餘位表示值. 比如如果是8位二進位制

[+1]原 = 0000 0001

[-1]原 = 1000 0001

因為第一位是符號位, 所以若是8位二進位制數,其取值範圍就是:

[1111 1111 , 0111 1111]

即[-127 , 127]

原碼是人腦最容易理解和計算的表示方式。

4 、反碼

反碼錶示法規定:正數的反碼與其原碼相同;負數的反碼是對其原碼逐位取反,但符號位除外。

[+1] = [ 00000001 ]原碼 = [ 00000001 ]反碼;

[-1] =  [ 10000001 ]原碼 = [ 11111110 ]反碼;

可見如果一個反碼錶示的是負數, 人腦無法直觀的看出來它的數值. 通常要將其轉換成原碼再計算。

什麼是二進位制的補碼?

註明:正數的補碼與負數的補碼一致,負數的補碼符號位為1,這位1即是符號位也是數值位,然後加1

補碼借鑑的模概念,雖然理解起來有點晦澀難懂。可以跳過

模的概念:把一個計量單位稱之為模或模數。例如,時鐘是以12進位制進行計數迴圈的,即以12為模。

在時鐘上,時針加上(正撥)12的整數位或減去(反撥)12的整數位,時針的位置不變。14點鐘在捨去模12後,成為(下午)2點鐘(14=14-12=2)。從0點出發逆時針撥10格即減去10小時,也可看成從0點出發順時針撥2格(加上2小時),即2點(0-10=-10=-10+12=2)。

因此,在模12的前提下,-10可對映為+2。由此可見,對於一個模數為12的迴圈系統來說,加2和減10的效果是一樣的;因此,在以12為模的系統中,凡是減10的運算都可以用加2來代替,這就把減法問題轉化成加法問題了(注:計算機的硬體結構中只有加法器,所以大部分的運算都必須最終轉換為加法)。

10和2對模12而言互為補數。同理,計算機的運算部件與暫存器都有一定字長的限制(假設字長為16),因此它的運算也是一種模運算。當計數器計滿16位也就是65536個數後會產生溢位,又從頭開始計數。

產生溢位的量就是計數器的模,顯然,16位二進位制數,它的模數為2^16=65536。在計算中,兩個互補的數稱為「補碼」。比如一個有符號8位的數可以表示256個資料,最大數是0

1 1 1 1 1 1 1(+127),最小數1 0 0 0 0 0 0 0

(-128);那麼第255個資料,加2和減254都是一樣的效果得出的結果是第一個資料

,所以2和254是一樣的效果。對於255來說2和254是互補的數。

求一個正數對應補碼是一種數值的轉換方法,要分二步完成:

第一步,每一個二進位制位都取相反值,即取得反碼;0變成1,1變成0。比如,00001000的反碼就是11110111。

第二步,將上一步得到的反碼加1。11110111就變成11111000。所以,00001000的二進位制補碼就是11111000。

也就是說,-8在計算機(8位機)中就是用11111000表示。

不知道你怎麼看,反正我覺得很奇怪,為什麼要採用這麼麻煩的方式表示負數,更直覺的方式難道不好嗎?

二進位制補碼的好處

首先,要明確一點。計算機內部用什麼方式表示負數,其實是無所謂的。只要能夠保持一一對應的關係,就可以用任意方式表示負數。

所以,既然可以任意選擇,那麼理應選擇一種用的爽直觀方便的方式。

二進位制的補碼就是最方便的方式。它的便利體現在,所有的加法運算可以使用同一種電路完成。

還是以-8作為例子。假定有兩種表示方法。一種是直覺表示法,即10001000;另一種是2的補碼錶示法,即11111000。

請問哪一種表示法在加法運算中更方便?隨便寫一個計算式,16

+ (-8) = ?16的二進位制表示是 00010000,所以用直覺表示法,加法就要寫成:

00010000

+10001000原碼形式-8

---------

10011000

可以看到,如果按照正常的加法規則,就會得到10011000的結果,轉成十進位制就是-24。顯然,這是錯誤的答案。也就是說,在這種情況下,正常的加法規則不適用於正數與負數的加法,因此必須制定兩套運算規則,一套用於正數加正數,還有一套用於正數加負數。

從電路上說,就是必須為加法運算做兩種電路。所以用原碼錶示負數是不行的。

現在,再來看二進位制的補碼錶示法。

00010000

+11111000補碼形式-8

---------

100001000

可以看到,按照正常的加法規則,得到的結果是100001000。注意,這是一個9位的二進位制數。我們已經假定這是一臺8位機,因此最高的第9位是一個溢位位,會被自動捨去。

所以,結果就變成了00001000,轉成十進位制正好是8,也就是16 + (-8) 的正確答案。這說明了,2的補碼錶示法可以將加法運算規則,擴充套件到整個整數集,從而用一套電路就可以實現全部整數的加法。

二進位制補碼的本質,本質是用來表示負整數的

為什麼正數加法也適用於二進位制的補碼?

實際上,我們要證明的是,x-y或x+(-y)可以用x加上y的2的補碼(-y)完成。

y的二進位制補碼等於(11111111-y)+1。所以,x加上y的2的補碼,就等於:x + (11111111-y) + 1;我們假定這個算式的結果等於z,即 z = x + (11111111-y) + 1。

接下來,分成兩種情況討論。

第一種情況,如果x小於y,那麼z是一個負數。這時,我們就對z採用補碼的逆運算,就是在做一次求補碼運算,求出它對應的正數絕對值,只要前面加上負號就行了。所以,

z = -[11111111-z+1] = -[11111111-(x + (11111111-y) + 1)+1)] = x -

y;這裡如果x y z都是無符號型的,且x < y 那麼z 最終得到的數是|x-y|距離的絕對值了,比如x=1,y=

255,那麼z=2,因為從255到1只要加兩次就到了。這裡你不要問我為什麼,這裡就用到上面的模概念。

第二種情況,如果x大於y,這意味著z肯定大於11111111,但是我們規定了這是8位機,最高的第9位是溢位位,必須被捨去,捨去相當於減去嗎!所以減去100000000。所以,

z = z - 100000000 = x + (11111111-y) + 1 - 100000000 = x - y

這就證明了,在正常的加法規則下,可以利用2的補碼得到正數與負數相加的正確結果。換言之,計算機只要部署加法電路和補碼電路,就可以完成所有整數的加法。

二進位制數為什麼不是負數?二進位制中的負數怎麼表示

二進位制小數的位權都是2的負整數次冪,即階數為負數。例如二進位制小數,轉換成十進位制小數 二進位制數 二進位制數除法與十進位制數除法很類似,可先從被除數的最高位開始,將被除數 或中間餘數 與除數相比較,若被除數 或中間餘數 大於除數,則用被除數 或中間餘數 減去除數,商為1,並得相減之後的中間餘數,...

二進位制如何表示負數啊負數用二進位制怎麼表示呀?

在二進位制碼中,採用最高位是符號位的方法來區分正負 數,正數的符號位為0 負數的符號位為1。剩下的就是這個數的絕對值部分。通過將負數轉為二進位制原碼,再求其原碼的反碼,最後求得的補碼即負數的二進位制表示結果。比如整數 1。先取1的原碼 00000000 00000000 00000000 00000...

二進位制的負數如何算,二進位制的負數如何算?

在二進位制碼中,採用最高位是符號位的方法來區分正負數,正數的符號位為0 負數的符號位為1。剩下的就是這個數的絕對值部分。通過將負數轉為二進位制原碼,再求其原百碼的反碼,最後求得的補碼即負數的二進位制表示結果。比如整數 1。先取1的原碼 00000000 00000000 00000000 00000...