小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

原碼,反碼,補碼[轉(zhuǎn)

 Jeffica 2010-10-10

原碼,反碼,補碼[轉(zhuǎn)]

文章分類:C++編程
[轉(zhuǎn)載]http://shychj-chjshy.blog.sohu.com/73142224.html
1、原碼、反碼和補碼的表示方法

(1)    原碼:在數(shù)值前直接加一符號位的表示法。

例如:      符號位  數(shù)值位

[+7]原=   0    0000111  B

[-7]原=   1    0000111  B

     注意:a. 數(shù)0的原碼有兩種形式:

             [+0]原=00000000B    [-0]原=10000000B

           b. 8位二進(jìn)制原碼的表示范圍:-127~+127

(2)反碼:

     正數(shù):正數(shù)的反碼與原碼相同。

     負(fù)數(shù):負(fù)數(shù)的反碼,符號位為“1”,數(shù)值部分按位取反。

例如:     符號位 數(shù)值位

     [+7]反=  0   0000111  B

     [-7]反=  1   1111000  B

注意:a. 數(shù)0的反碼也有兩種形式,即

         [+0]反=00000000B

         [- 0]反=11111111B

      b. 8位二進(jìn)制反碼的表示范圍:-127~+127

(3)補碼的表示方法

12)補碼的表示:

    正數(shù):正數(shù)的補碼和原碼相同。

    負(fù)數(shù):負(fù)數(shù)的補碼則是符號位為“1”,數(shù)值部分按位取反后再在末位(最低位)加1。也就是“反碼+1”。

例如:       符號位 數(shù)值位

      [+7]補=   0   0000111  B

      [-7]補=   1   1111001  B

補碼在微型機(jī)中是一種重要的編碼形式,請注意:

a.             采用補碼后,可以方便地將減法運算轉(zhuǎn)化成加法運算,運算過程得到簡化。正數(shù)的補碼即是它所表示的數(shù)的真值,而負(fù)數(shù)的補碼的數(shù)值部份卻不是它所表示的數(shù)的真值。采用補碼進(jìn)行運算,所得結(jié)果仍為補碼。

b.            與原碼、反碼不同,數(shù)值0的補碼只有一個,即       [0]補=00000000B。

c.             若字長為8位,則補碼所表示的范圍為-128~+127;進(jìn)行補碼運算時,應(yīng)注意所得結(jié)果不應(yīng)超過補碼所能表示數(shù)的范圍。

2.原碼、反碼和補碼之間的轉(zhuǎn)換

由于正數(shù)的原碼、補碼、反碼表示方法均相同,不需轉(zhuǎn)換。

在此,僅以負(fù)數(shù)情況分析。

(1)    已知原碼,求補碼。

例:已知某數(shù)X的原碼為10110100B,試求X的補碼和反碼。

解:由[X]原=10110100B知,X為負(fù)數(shù)。求其反碼時,符號位不變,數(shù)值部分按位求反;求其補碼時,再在其反碼的末位加1。

1  0  1  1  0  1  0  0   原碼



1  1  0  0  1  0  1  1   反碼,符號位不變,數(shù)值位取反

                     1   +1

1  1  0  0  1  1  0  0   補碼

故:[X]補=11001100B,[X]反=11001011B。

(2)    已知補碼,求原碼。

分析:按照求負(fù)數(shù)補碼的逆過程,數(shù)值部分應(yīng)是最低位減1,然后取反。但是對二進(jìn)制數(shù)來說,先減1后取反和先取反后加1得到的結(jié)果是一樣的,故仍可采用取反加1 有方法。

例:已知某數(shù)X的補碼11101110B,試求其原碼。

解:由[X]補=11101110B知,X為負(fù)數(shù)。求其原碼表示時,符號位不變,數(shù)值部分按位求反,再在末位加1。

1  1  1  0  1  1  1  0   補碼



1  0  0  1  0  0  0  1   符號位不變,數(shù)值位取反

                     1   +1

1  0  0  1  0  0  1  0   原碼


#include<stdio.h>
void main()
{
     short int tt = 65535 ;
    //unsigned short int tt =  0XFF43;
    printf("size of is %d\n",sizeof(tt));
    printf("%0X\n",tt);
    printf("%d\n",tt);
}
結(jié)果:
size of is 2
FFFFFFFF
-1
輸出FFFFFFFF 是因為在第2個Printf,傳遞參數(shù)的時候,系統(tǒng)將Short int 自動轉(zhuǎn)化為Int .

#include<stdio.h>
void main()
{
     short int tt = -1 ;
    //unsigned short int tt =  0XFF43;
    printf("size of is %d\n",sizeof(tt));
    printf("%0X\n",tt);
    printf("%u\n",(unsigned short int)tt);
}

輸出:
size of is 2
FFFFFFFF
65535

############################
        int main(void)
        {
            unsigned int un = 3000000000; /* 我使用的編譯器 int 是 32 位的 */
            short end = 200;              /* 而 short 是 16 位的      */
            long big = 65537;

            printf("un = %u and not %d\n", un, un);
            printf("end = %hd and %d\n", end, end);
            printf("big = %ld and not %hd\n", big, big);

            printf("Press ENTER to quit...");
            getchar();
            return 0;
        }

程序輸出結(jié)果如下:

        un = 3000000000 and not -1294967296
        end = 200 and 200
        big = 65537 and not 1
        Press ENTER to quit...

    這個程序表明,錯誤使用格式限定符會導(dǎo)致意想不到的輸出。首先,錯誤使用 %d 來做無符號整型變量 un 的格式限定符,導(dǎo)致輸出的是負(fù)數(shù)。這是因為我的計算機(jī)使用相同的二進(jìn)制形式來表示 3000000000 和 -129496296 ,而計算機(jī)只認(rèn)識二進(jìn)制。所以,如果我們使用 %u 告訴 printf 輸出無符號整數(shù),輸出的就是 3000000000;如果我們誤用了 %d,那么輸出的就是一個負(fù)數(shù)。不過,如果我們把代碼中的 3000000000 改成 96 的話,輸出就不會出現(xiàn)異常。因為 96 沒有超出 int 的表示范圍。

    然后,對于第二個 printf,無論我們使用 %hd 還是 %d,輸出的結(jié)果都是一樣的。這是因為 C 語言標(biāo)準(zhǔn)規(guī)定,當(dāng) short 類型值傳遞給函數(shù)時,要自動轉(zhuǎn)化成 int 類型值。之所以轉(zhuǎn)化成 int,是因為 int 被設(shè)計為計算機(jī)處理效率最高的整數(shù)類型。所以,對于 short 和 int 大小不同的計算機(jī)來說,把變量 end 轉(zhuǎn)化成 int 類型再傳遞給函數(shù),速度更快。如此說來,h 好像沒有存在意義。其實不然。我們可以用 %hd 來看看較大的整數(shù)類型被截斷成 short 類型的時候會是什么樣的。

    而第三個 printf,由于誤用 %hd,導(dǎo)致輸出是 1。這是因為,如果 long 是 32 位的話,65537 的二進(jìn)制形式便是 0000 0000 0000 0001 0000 0000 0000 0001,而 %hd 命令 printf 輸出 short 類型的值,從而導(dǎo)致 printf 只處理 16 位數(shù)據(jù)(假設(shè) short 是 16 位的),最終導(dǎo)致輸出 1。

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多