<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    keep moving!

    We must not cease from exploration. And the end of all our exploring will be to arrive where we began and to know the place for the first time.
    隨筆 - 37, 文章 - 2, 評論 - 3, 引用 - 0
    數據加載中……

    [轉]理解有符號數和無符號數

    理解有符號數和無符號數

    回頭看上一節,我們所講的數都是正數。同樣是年紀和工資,前者不需要有負值,但后者可能需要——至少所有的老板都這樣認為。

    那么,負數在計算機中如何表示呢?

    這一點,你可能聽過兩種不同的回答。

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

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

    讓我們從頭說起。

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

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

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

    數值類型分為整型或實型,其中整型又分為無符類型或有符類型,而實型則只有符類型。

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

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

    2、使用二制數中的最高位表示正負。

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

    (紅色為最高位)

    單字節數: 1111 1111

    雙字節數: 1111 1111 1111 1111

    四字節數: 1111 1111 1111 1111 1111 1111 1111 1111

     

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

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

     

    3、無符號數和有符號數的范圍區別。

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

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

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

     

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

    不過,有符號數的長處是它可以表示負數。因此,雖然它的在最大值縮水了,卻在負值的方向出現了伸展。我們仍一個字節的數值對比:

    無符號數:                       0 ----------------- 255

    有符號數:        -128 --------- 0 ---------- 127

     

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

    一個有符號的數據類型的最小值是如何計算出來的呢?

    有符號的數據類型的最大值的計算方法完全和無符號一樣,只不過它少了一個最高位(見第3點)。但在負值范圍內,數值的計算方法不能直接使用1* 26 + 1* 25 的公式進行轉換。在計算機中,負數除為最高位為1以外,還采用補碼形式進行表達。所以在計算其值前,需要對補碼進行還原。這些內容我們將在第六章中的二進制知識中統一學習。

    這里,先直觀地看一眼補碼的形式:

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

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

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

     

    二進制值(1字節) 十進制值
    1000 0000 -128
    1000 0001 -127
    1000 0010 -126
    1000 0011 -125
    ... ...
    1111 1110 -2
    1111 1111 -1

     

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

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

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

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

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

    字節數 二進制值 十進制值
    單字節數 1111 1111 -1
    雙字節數 1111 1111 1111 1111 -1
    四字節數 1111 1111 1111 1111 1111 1111 1111 1111 -1

     

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

     

     原碼、反碼、補碼

    我們已經知道計算機中,所有數據最終都是使用二進制數表達。

    我們也已經學會如何將一個10進制數如何轉換為二進制數。

    不過,我們仍然沒有學習一個負數如何用二進制表達。

     

    比如,假設有一 int 類型的數,值為5,那么,我們知道它在計算機中表示為:

    00000000 00000000 00000000 00000101

    5轉換成二制是101,不過int類型的數占用4字節(32位),所以前面填了一堆0。

    現在想知道,-5在計算機中如何表示?

     

    在計算機中,負數以其正值的補碼形式表達

    什么叫補碼呢?這得從原碼,反碼說起。

     

    原碼:一個整數,按照絕對值大小轉換成的二進制數,稱為原碼。

    比如 00000000 00000000 00000000 00000101 是 5的 原碼。

     

    反碼:將二進制數按位取反,所得的新二進制數稱為原二進制數的反碼。

    取反操作指:原為1,得0;原為0,得1。(1變0; 0變1)

    比如:將00000000 00000000 00000000 00000101每一位取反,得11111111 11111111 11111111 11111010。

    稱:11111111 11111111 11111111 11111010 是 00000000 00000000 00000000 00000101 的反碼。

    反碼是相互的,所以也可稱:

    11111111 11111111 11111111 11111010 和 00000000 00000000 00000000 00000101 互為反碼。

     

    補碼:反碼加1稱為補碼。

    也就是說,要得到一個數的補碼,先得到反碼,然后將反碼加上1,所得數稱為補碼。

    比如:00000000 00000000 00000000 00000101 的反碼是:11111111 11111111 11111111 11111010。

    那么,補碼為:

    11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011

     

    所以,-5 在計算機中表達為:11111111 11111111 11111111 11111011。轉換為十六進制:0xFFFFFFFB。

     

    再舉一例,我們來看整數-1在計算機中如何表示。

    假設這也是一個int類型,那么:

     

    1、先取1的原碼:00000000 00000000 00000000 00000001

    2、得反碼:     11111111 11111111 11111111 11111110

    3、得補碼:     11111111 11111111 11111111 11111111

     

    可見,-1在計算機里用二進制表達就是全1。16進制為:0xFFFFFF。

     

    計算機原理-原碼、反碼、補碼

    首先要說的是:計算機中的帶符號數一般用補碼表示

    計算機中的帶符號數用補碼表示的優點:
    1、負數的補碼與對應正數的補碼之間的轉換可以用同一種方法——求補運算完成,可以簡化硬件;
    2、可將減法變為加法,省去減法器;
    3、無符號數及帶符號數的加法運算可以用同一電路完成。

    帶符號數的表示

    先引進兩個名詞:機器數真值

    將一個數在機器中的表示形式,即編碼稱為機器數,數的本身稱為真值。平常我們經常用的帶符號的數就是真數,如:+50,-10.5等等。

    常用的機器數有三種:原碼補碼反碼

    1.原碼

        通俗定義

       將數的符號數碼化,即用一個二進制位表示符號:對正數,該位取0,對負數,該位取1

    而數值部分保持數的原有形式(有時需要在高位部分添幾個0)。這樣所得結果為該數的原碼表示。

        例,x=+1001010y= -1001010z= 1110(= 0001110)。當原碼為8位時,xyz的原碼分別是:

        [x]=01001010

        [y]=11001010

        [Z]=10001110

    其中最高位為符號位。

    2)正規定義

    2.反碼

     

    反碼:正數的反碼為原碼,負數的反碼是原碼符號位外按位取反。

    例如:

    X1=+67=+100 0011B         ,[X1]=0100 0011B
    X2=-67=-100 0011B         ,[X2]=1011 1100B

    對正數,其反碼與原碼相同,也與補碼相同。對負數,其反碼等于原碼除符號位外,按位求反(末位不加1)。利用反碼也可使帶符號數的加、減法轉化為單純的加法,但麻煩一些。

    一般把求反碼作為求補的中間過程,即 [x]=[x]+1

    3.補碼

    1)補碼的引進和定義

        據統計,在所有的運算中,加、減運算要占到80%以上,因此,能否方便地進行正、負數加、減運算,直接關系到計算機的運行效率。

    把一個負數加模的結果稱為該負數的補碼(結果是一個正數,它和該負數是等價的,確切地說,是一對一的,因而可看作是該負數的編碼),定義正數的補碼就是它本身,符號位取0,即和原碼相同。這就是補碼的通俗定義。將這個定義用數學形式表示出來,就可得到補碼的正規定義:

     



    其中n為補碼的位數。這個定義實際也將真值的范圍給出來了,當n=8時,一27x<27和原碼相比,補碼表示可多表示一個數。當n=8時,多表示的數是一27=128

      2)補碼的求法

      對正數,補碼同原碼。

               例如,x=+0101001[x]=[x]=00101001

           對負數,由定義求補碼,需做減法,不方便。經推導可知,負數的補碼等于其原碼除符號位外按位“求反”(1001),末位再加1

               例如,y=0001100[y]=10001100[Y]=11110011+1=11110100

     

    算法:
    1.正數的補碼與原碼相同;
    2.負數的補碼由原碼除符號位保持不變外,其余各位按位取反,再在末位加1。
       [x]=[x]+1

     

        多做幾例,可得出一種心算求補的方法——從最低位開始至找到的第一個1均不變,符號位不變,這之間的各位“求反”(該方法僅用于做題)

    真值與三種機器數間的對照表

    真值X

    [X][X][X]

     

    真值X

    [X]

    [X]

    [X]

    十進制

    二進制

    十進制

    二進制

    +0

    +000

    0000

    -0

    -0000

    1000

    1111

    0000

    +1

    +001

    0001

    -1

    -0001

    1001

    1110

    1111

    +2

    +010

    0010

    -2

    -0010

    1010

    1101

    1110

    +3

    +011

    0011

    -3

    -0011

    1011

    1100

    1101

    +4

    +100

    0100

    -4

    -0100

    1100

    1011

    1100

    +5

    +101

    0101

    -5

    -0101

    1101

    1010

    1011

    +6

    +110

    0110

    -6

    -0110

    1110

    1001

    1010

    +7

    +111

    0111

    -7

    -0111

    1111

    1000

    1001

    +8

    -

    -

    -8

    -1000

    -

    -

    1000

    posted on 2008-09-07 02:11 大石頭 閱讀(2151) 評論(0)  編輯  收藏 所屬分類: 基礎

    主站蜘蛛池模板: 四虎永久免费影院| 亚洲AV无码成人精品区狼人影院| 在线观看日本免费a∨视频| 天堂亚洲免费视频| 亚洲情A成黄在线观看动漫软件 | 免费人成视网站在线观看不卡| 永久黄色免费网站| 中文字幕无码毛片免费看| 国产综合成人亚洲区| 亚洲一区二区三区免费视频| 亚洲国产精品一区二区久久hs| 国产免费牲交视频| 成年女人18级毛片毛片免费 | 4hu四虎最新免费地址| 免费精品99久久国产综合精品| 免费看美女午夜大片| 亚洲国产精品成人综合色在线| 亚洲区视频在线观看| 亚洲精品高清国产一久久| 三上悠亚亚洲一区高清| www.亚洲色图| 午夜国产羞羞视频免费网站| 好爽又高潮了毛片免费下载| 日韩免费精品视频| 亚洲精品无码久久不卡| 免费视频中文字幕| 四虎成人免费网址在线| 成人影片麻豆国产影片免费观看| 亚洲黄色免费观看| 在线看片免费人成视久网| 久久成人免费电影| 亚洲欧洲免费视频| 99国产精品免费视频观看| 日韩视频免费在线观看| 免费污视频在线观看| 最近中文字幕大全免费版在线| aa级女人大片喷水视频免费 | 亚洲一级Av无码毛片久久精品| 亚洲精品无码久久久| 国产亚洲精品无码专区| 亚洲精品自产拍在线观看|