久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

分享:負數(shù)的二進制編碼——越是基礎的越是要掌握

 貧窮的小悍馬 2011-04-06

原碼就是原來的表示方法

反碼是除符號位(最高位)外取反

補碼=反碼+1

以前學習二進制編碼時,老師講了一堆堆的什么原碼啊反碼啊補碼啊xxxx轉(zhuǎn)換啊,,還有負數(shù)的表示方式啊 總是記不零清,,終于從網(wǎng)上找到了一種比較好的講解方式,保存再share一下,,不過為了系統(tǒng)化講解,,又找來了一些編碼的基礎知識,如果只想看負數(shù)編碼記憶法,,請?zhí)D(zhuǎn)到

1.如果你不知道二進制怎么編碼,,請繼續(xù),否則請?zhí)?

    1字節(jié) = 8位,,所以它能表示的最大數(shù)當然是8位都是1(既然2進制的數(shù)只能是0或1,如果是我們常見的10進制,,那就8位都為9,這樣說,,你該懂了,?)

1字節(jié)的二進制數(shù)中,最大的數(shù):11111111,。

    這個數(shù)的大小是多少呢,?讓我們來把它轉(zhuǎn)換為十進制數(shù)。

    無論是什么進制,,都是左邊是高位,,右邊是低位。10進制是我們非常習慣的計數(shù)方式,,第一位代表有幾個1(即幾個100),,第二位代表有幾個10(即幾個101),第三位代表有幾個100(即有幾個102)…,用小學課本上的說法就是:個位上的數(shù)表示幾個1,,十位上的數(shù)表示向個10,百位上的數(shù)表示幾個100……

    同理可證,,二進制數(shù)則是:第1位數(shù)表示幾個1 (20),,第2位數(shù)表示幾個2(21),第3位數(shù)表示幾個4(22),,第4位數(shù)表示向個8(23)……

    以前我們知道1個字節(jié)有8位,,現(xiàn)在通過計算,我們又得知:1個字節(jié)可以表達的最大的數(shù)是255,也就是說表示0~255這256個數(shù),。

     那么兩個字節(jié)(雙字節(jié)數(shù))呢,?雙字節(jié)共16位。 1111111111111111,,這個數(shù)并不大,,但長得有點眼暈,從現(xiàn)在起,,我們要學會這樣來表達二制數(shù):

1111 1111 1111 1111,即每4位隔一空格,。

雙字節(jié)數(shù)最大值為:

1 * 215 + 1 *214 + 1* 213 + 1 * 212 + 1 * 211 + 1 * 210 + …… + 1 * 22 + 1 * 21 + 1* 20 = 65535

    很自然,我們可以想到,,一種數(shù)據(jù)類型允許的最大值,,和它的位數(shù)有關。具體的計算方法方法是,,如果它有n位,,那么最大值就是:

n位二進制數(shù)的最大值:1 * 2(n-1) + 1 * 2(n-2) + ... + 1 * 20

2、理解有符號數(shù)和無符號數(shù)

負數(shù)在計算機中如何表示呢,?這一點,,你可能聽過兩種不同的回答。

一 種是教科書,,它會告訴你:計算機用“補碼”表示負數(shù),。可是有關“補碼”的概念一說就得一節(jié)課,,這一些我們需要在第6章中用一章的篇幅講2進制的一切,。再 者,用“補碼”表示負數(shù),,其實是一種公式,,公式的作用在于告訴你,想得到問題的答案,,應該如何計算,。卻并沒有告訴你為什么用這個公式就可以得到答案? -----我就是被這個弄混淆的>_<

另 一種是一些程序員告訴你的:用二進制數(shù)的最高位表示符號,最高位是0,,表示正數(shù),,最高位是1,表示負數(shù),。這種說法本身沒錯,,可是如果沒有下文,那么它就是 錯的,。至少它不能解釋,,為什么字符類型的-1用二進制表示是“1111 1111”(16進制為FF);而不是我們更能理解的“1000 0001”,。(為什么說后者更好理解呢,?因為既然說最高位是1時表示負數(shù),那1000 0001不是正好是-1嗎,?-----re,!當初偶就是這么想的,so一直在腦中打架,,越打越混淆=,,=)。

讓我們從頭說起,。

2.1,、你自已決定是否需要有正負。

就像我們必須決定某個量使用整數(shù)還是實數(shù),,使用多大的范圍數(shù)一樣,,我們必須自已決定某個量是否需要正負。如果這個量不會有負值,,那么我們可以定它為帶正負的類型,。

在計算機中,可以區(qū)分正負的類型,,稱為有符類型,,無正負的類型(只有正值),稱為無符類型,。

數(shù)值類型分為整型或?qū)嵭?,其中整型又分為無符類型或有符類型,而實型則只有有符類型,。

字符類型也分為有符和無符類型,。

比如有兩個量,年齡和庫存,,我們可以定前者為無符的字符類型,,后者定為有符的整數(shù)類型,。

2、使用二制數(shù)中的最高位表示正負,。

首先得知道最高位是哪一位,?1個字節(jié)的類型,如字符類型,,最高位是第7位,,2個字節(jié)的數(shù),最高位是第15位,,4個字節(jié)的數(shù),最高位是第31位,。不同長度的數(shù)值類型,,其最高位也就不同,但總是最左邊的那位(如下示意),。字符類型固定是1個字節(jié),,所以最高位總是第7位。

(紅色為最高位)

單字節(jié)數(shù): 1111 1111

雙字節(jié)數(shù): 1111 1111 1111 1111

四字節(jié)數(shù): 1111 1111 1111 1111 1111 1111 1111 1111

當我們指定一個數(shù)量是無符號類型時,,那么其最高位的1或0,,和其它位一樣,用來表示該數(shù)的大小,。

當我們指定一個數(shù)量是有符號類型時,,此時,最高數(shù)稱為“符號位”,。為1時,,表示該數(shù)為負值,為0時表示為正值,。

 3,、無符號數(shù)和有符號數(shù)的范圍區(qū)別。

無符號數(shù)中,,所有的位都用于直接表示該值的大小,。有符號數(shù)中最高位用于表示正負,所以,,當為正值時,,該數(shù)的最大值就會變小。我們舉一個字節(jié)的數(shù)值對比:

無符號數(shù): 1111 1111   值:255 1* 27 + 1* 26 + 1* 25 + 1* 24 + 1* 23 + 1* 22 + 1* 21 + 1* 20

有符號數(shù): 0111 1111   值:127         1* 26 + 1* 25 + 1* 24 + 1* 23 + 1* 22 + 1* 21 + 1* 20

  同樣是一個字節(jié),,無符號數(shù)的最大值是255,,而有符號數(shù)的最大值是127。原因是有符號數(shù)中的最高位被挪去表示符號了,。并且,,我們知道,最高位的權值也是最高的(對于1字節(jié)數(shù)來說是2的7次方=128),所以僅僅少于一位,,最大值一下子減半,。

不過,有符號數(shù)的長處是它可以表示負數(shù),。因此,,雖然它的在最大值縮水了,卻在負值的方向出現(xiàn)了伸展,。我們?nèi)砸粋€字節(jié)的數(shù)值對比:

無符號數(shù):                       0 ----------------- 255

有符號數(shù):        -128 --------- 0 ---------- 127

 

同樣是一個字節(jié),,無符號的最小值是 0 ,而有符號數(shù)的最小值是-128,。所以二者能表達的不同的數(shù)值的個數(shù)都一樣是256個,。只不過前者表達的是0到255這256個數(shù),后者表達的是-128到+127這256個數(shù),。

一個有符號的數(shù)據(jù)類型的最小值是如何計算出來的呢,?

有符號的數(shù)據(jù)類型的最大值的計算方法完全和無符號一樣,只不過它少了一個最高位(見第3點),。但在負值范圍內(nèi),,數(shù)值的計算方法不能直接使用1* 26 + 1* 25 的公式進行轉(zhuǎn)換。在計算機中,,負數(shù)除為最高位為1以外,,還采用補碼形式進行表達。所以在計算其值前,,需要對補碼進行還原,。這里,先直觀地看一眼補碼的形式:

以我們原有的數(shù)學經(jīng)驗,,在10進制中:1 表示正1,,而加上負號:-1 表示和1相對的負值。

那么,,我們會很容易認為在2進制中(1個字節(jié)): 0000 0001 表示正1,,則高位為1后:1000 0001應該表示-1。

然而,,事實上計算機中的規(guī)定有些相反,,請看下表:

 

二進制值(1字節(jié)) 十進制值
1000 0000紅色的1代表負數(shù)藍色的是補碼(補碼=反碼+1) -128
1000 0001藍色部分代表多大的值?:將補碼還原為原碼 -127想化成負數(shù),?:先減去1按位取反
1000 0010還原方法:補碼-1再取反 -126
1000 0011 -125
... ...
1111 1110 -2
1111 1111 -1

 

首先我們看到,,從-1到-128,其二進制的最高位都是1(表中標為紅色),,正如我們前面的學,。

然后我們有些奇怪地發(fā)現(xiàn),,1000 0000 并沒有拿來表示 -0;而1000 0001也不是拿來直觀地表示-1,。事實上,,-1 用1111 1111來表示。

怎么理解這個問題呢,?先得問一句是-1大還是-128大,?

當 然是 -1 大。-1是最大的負整數(shù),。以此對應,,計算機中無論是字符類型,或者是整數(shù)類型,,也無論這個整數(shù)是幾個字節(jié),。它都用全1來表示 -1。比如一個字節(jié)的數(shù)值中:1111 1111表示-1,,那么,,1111 1111 - 1 是什么呢,?和現(xiàn)實中的計算結果完全一致,。1111 1111 - 1 = 1111 1110,而1111 1110就是-2,。這樣一直減下去,,當減到只剩最高位用于表示符號的1以外,其它低位全為0時,,就是最小的負值了,,在一字節(jié)中,最小的負值是1000 0000,,也就是-128,。

--------小米批注:就是這部分藍色的文字,讓我終于能記清楚-1的編碼方式了,,汗=,。=

我們以-1為例,來看看不同字節(jié)數(shù)的整數(shù)中,,如何表達-1這個數(shù):

字節(jié)數(shù) 二進制值 十進制值
單字節(jié)數(shù) 1111 1111紅色表示負數(shù)藍色部分的補碼為值1 -1
負數(shù):原碼就是原來的表示方法,、反碼是除符號位(最高位)外取反、補碼=反碼+1雙字節(jié)數(shù) 1111 1111 1111 1111 -1
四字節(jié)數(shù) 1111 1111 1111 1111 1111 1111 1111 1111 -1

可 能有同學這時會混了:為什么 1111 1111 有時表示255,,有時又表示-1,?所以我再強調(diào)一下本節(jié)前面所說的第2點:你自已決定一個數(shù)是有符號還是無符號的。寫程序時,,指定一個量是有符號的,,那么 當這個量的二進制各位上都是1時,,它表示的數(shù)就是-1;相反,,如果事選聲明這個量是無符號的,,此時它表示的就是該量允許的最大值,對于一個字節(jié)的數(shù)來說,, 最大值就是255,。

ok 摘抄暫告段落,其實原文對于c的一些基礎數(shù)據(jù)類型知識介紹的非常詳細,,8過太長了,,摘到我需要的內(nèi)容后就沒全帖過來,如果有需要學習的同學,,建議參見原文:)

轉(zhuǎn)自http://blog./7892477/1201309.aspx

關鍵字: 二進制編碼,,負數(shù)二進制,二進制

2007-09-09 14:24:25
標簽:教育雜談

    在計算機內(nèi)部,所有信息都是用二進制數(shù)串的形式表示的,。整數(shù)通常都有正負之分,,計算機中的整數(shù)分為無符號的和帶符號的。無符號的整數(shù)用來表示0和正整數(shù),, 帶符號的證書可以表示所有的整數(shù),。由于計算機中符號和數(shù)字一樣,都必須用二進制數(shù)串來表示,,因此,,正負號也必須用0、1來表示,。通常我們用最高的有效位來 表示數(shù)的符號(當用8位來表示一個整數(shù)時,,第8位即為最高有效位,當用16位來表示一個整數(shù)時,,第16位即為最高有效位,。)0表示正號、1表示負號,,這種 正負號數(shù)字化的機內(nèi)表示形式就稱為“機器數(shù)”,,而相應的機器外部用正負號表示的數(shù)稱為“真值”。將一個真值表示成二進制字串的機器數(shù)的過程就稱為編碼,。

    無符號數(shù)沒有原碼,、反碼和補碼一說。只有帶符號數(shù)才存在不同的編碼方式,。

帶符號整數(shù)有原碼,、反碼,、補碼等幾種編碼方式。原碼即直接將真值轉(zhuǎn)換為其相應的二進制形式,,而反碼和補碼是對原碼進行某種轉(zhuǎn)換編碼方式,。正整數(shù)的原 碼、反碼和補碼都一樣,,負數(shù)的反碼是對原碼的除符號位外的其他位進行取反后的結果(取反即如果該位為0則變?yōu)?,,而該位為1則變?yōu)?的操作)。而補碼是先 求原碼的反碼,,然后在反碼的末尾位加1 后得到的結果,,即補碼是反碼+1。IBM-PC中帶符號整數(shù)都采用補碼形式表示,。(注意,,只是帶符號的整數(shù)采用補碼存儲表示的,浮點數(shù)另有其存儲方式,。)

    采用補碼的原因或好處如下,。

    采用補碼運算具有如下兩個特征:

    1)因為使用補碼可以將符號位和其他位統(tǒng)一處理,同時,,減法也可以按加法來處理,,即如果是補碼表示的數(shù),不管是加減法都直接用加法運算即可實現(xiàn),。

    2)兩個用補碼表示的數(shù)相加時,,如果最高位(符號位)有進位,,則進位被舍棄,。

    這樣的運算有兩個好處:

    1)使符號位能與有效值部分一起參加運算,從而簡化運算規(guī)則,。從而可以簡化運算器的結構,,提高運算速度;(減法運算可以用加法運算表示出來,。)

    2)加法運算比減法運算更易于實現(xiàn),。使減法運算轉(zhuǎn)換為加法運算,進一步簡化計算機中運算器的線路設計,。

    下面深入分析上面所陳述的采用補碼的原因(目的),。

    用帶符號位的原碼進行乘除運算時結果正確,而在加減運算的時候就出現(xiàn)了問題,如下:假設字長為8bits

    ( 1 ) 10- ( 1 )10 = ( 1 )10 + ( -1 )10 = ( 0 )10

    (00000001)原 + (10000001)原 = (10000010)原 = ( -2 ) 顯然不正確.,。

    因為在兩個整數(shù)的加法運算中是沒有問題的,,于是就發(fā)現(xiàn)問題出現(xiàn)在帶符號位的負數(shù)身上,對除符號位外的其余各位逐位取反就產(chǎn)生了反碼,。反碼的取值空間和原碼相同且一一對應,。下面是反碼的減法運算:

     ( 1 )10 - ( 1 ) 10= ( 1 ) 10+ ( -1 ) 10= ( 0 )10

     (00000001) 反+ (11111110)反 = (11111111)反 = ( -0 ) 有問題,。

    ( 1 )10 - ( 2)10 = ( 1 )10 + ( -2 )10 = ( -1 )10

     (00000001) 反+ (11111101)反 = (11111110)反 = ( -1 ) 正確

    問題出現(xiàn)在(+0)和(-0)上,在人們的計算概念中零是沒有正負之分的,。

于是就引入了補碼概念,。負數(shù)的補碼就是對反碼加一,而正數(shù)不變,,正數(shù)的原碼反碼補碼是一樣的,。在補碼中用(-128)代替了(-0),所以補碼的表示范圍為:

(-128~0~127)共256個,。

    注意:(-128)沒有相對應的原碼和反碼,, (-128) = (10000000) 補碼的加減運算如下:

    ( 1 ) 10- ( 1 ) 10= ( 1 )10 + ( -1 )10 = ( 0 )10

    (00000001)補 + (11111111)補 = (00000000)補 = ( 0 ) 正確

     ( 1 ) 10- ( 2) 10= ( 1 )10 + ( -2 )10 = ( -1 )10

    (00000001) 補+ (11111110) 補= (11111111)補 = ( -1 ) 正確

    采用補碼表示還有另外一個原因,那就是為了防止0的機器數(shù)有兩個編碼,。原碼和反碼表示的0有兩種形式+0和-0,,而我們知道,+0和-0是相同的,。這 樣,,8位的原碼和反碼表示的整數(shù)的范圍就是-127~+127(11111111~01111111),而采用補碼表示的時候,,00000000是+0,, 即0;10000000不再是-0,,而是-128,,這樣,補碼表示的數(shù)的范圍就是-128~+127了,,不但增加了一個數(shù)得表示范圍,,而且還保證了0編碼 的唯一性。

    整數(shù)和0的原碼,、反碼和補碼都相同,,下面介紹手工快速求負數(shù)補碼的方法。這個方法在教材的第8頁已經(jīng)提到了,,這里再寫出來以便能引起大家的注意,。其方法如下:

    先寫出該負數(shù)的相反數(shù)(正數(shù)),再將該正數(shù)的二進制形式寫出來,,然后對這個二進制位串按位取反,,即若是1則改為0,若是0則改為1,,最后在末位加1,。

接下來的問題是,如何能將減法運算轉(zhuǎn)換成加法運算呢,?

    我們已經(jīng)知道,,原碼表示簡單直觀,,與真值轉(zhuǎn)換容易。但如果用原碼表示,,其符號位不能參加運算,。在計算機中用原碼實現(xiàn)算術運算時,要取絕對值參加運算,,符號 位單獨處理,,這對乘除運算是很容易實現(xiàn)的,但對加減運算是非常不方便的,,如兩個異號數(shù)相加,,實際是要做減法,而兩個異號數(shù)相減,,實際是要做加法,。在做減法 時,還要判斷操作數(shù)絕對值的大小,,這些都會使運算器的設計變得很復雜,。而補碼這種編碼方式實際上正是針對上述問題的。通過用補碼進行表示,,就可以把減法運 算化為加法運算,。

    在日常生活中,有許多化減為加的例子,。例如,,時鐘是逢12進位,12點也可看作0點,。當將時針從10點調(diào)整到5點時有以下兩種方法:

    一種方法是時針逆時針方向撥5格,,相當于做減法:

        10-5=5

    另一種方法是時針順時針方向撥7格,相當于做加法:

      10+7=12+5=5    (MOD 12)

    這是由于時鐘以12 為模,,在這個前提下,,當和超過12時,,可將12舍去,。于是,減5相當于加7,。同理,,減4可表示成加8,減3可表示成加9,,…,。

    在數(shù)學中,用“同余”概念描述上述關系,,即兩整數(shù)A,、B用同一個正整數(shù)M (M稱為模)去除而余數(shù)相等,,則稱A、B對M同余,,記作:

       A=B     (MOD M)

    具有同余關系的兩個數(shù)為互補關系,,其中一個稱為另一個的補碼。當M=12時,,-5和+7,,-4和+8,-3和+9就是同余的,,它們互為補碼,。

    從同余的概念和上述時鐘的例子,不難得出結論:對于某一確定的模,,用某數(shù)減去小于模的另一個數(shù),,總可以用加上“模減去該數(shù)絕對值的差”來代替。因此,,在有模運算中,,減法就可以化作加法來做。

    可以看出,,補碼的加法運算所依據(jù)的基本關系為:

[x]補+ [y]補= [x+y]補

    補碼減法所依據(jù)的基本關系式:

[x-y]補 =[x+(-y)]補= [x]補+ [-y]補

    至于加法運算為什么比減法運算易于實現(xiàn)以及CPU如何實現(xiàn)各種算術運算等問題,,則需要通過對數(shù)字電路的學習來理解CPU的運算器的硬件實現(xiàn)問題的相關內(nèi)容了。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導購買等信息,,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多