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

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

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

    posts - 134,comments - 22,trackbacks - 0
    1.1.1.    信息存儲

    計算機(jī)處理、存儲的信息都是以二值符號表示的。這些二值數(shù)字,也就是位(bit),當(dāng)獨取一個出來,可能就沒有什么意義,但是把位組合到一起,加上某種解釋,就能夠表示我們想要表示的信息了。這里的按位組合,某種解釋,其實就是編碼方式。我們先來看三種最重要的數(shù)字編碼:

    無符號(unsigned)編碼,傳統(tǒng)二進(jìn)制表示法,表示大于或等于零的數(shù)字

    二進(jìn)制補(bǔ)碼(two’s-complement)編碼,表示有符號整數(shù)最常見的方式。

    浮點數(shù)(floating-point)編碼,表示實數(shù)的科學(xué)計數(shù)法以2為基數(shù)的版本。

    計算機(jī)用有限的位來對一個數(shù)字編碼,當(dāng)運算的結(jié)果超出表示的范圍時,運算就會導(dǎo)致溢出。

    1.1.1.1.          基本概念:

    字節(jié):計算機(jī)中8位的塊,最小的可尋址的存儲器單位。

    虛擬存儲器:機(jī)器級程序把存儲器視為一個非常大的字節(jié)數(shù)組。

    地址:存儲器的每個字節(jié)都有一個唯一的數(shù)字來標(biāo)識。

    虛擬地址空間:所有可能地址的集合。

    字:每臺計算機(jī)都有一個字長(word size),指明整數(shù)和指針數(shù)據(jù)的標(biāo)稱大小(norminal size)。一個字長為n位的機(jī)器,虛擬地址的范圍為0~2n-1,程序最多能訪問2n字節(jié)。

    C中的指針,不論其指向什么,都是某個存儲塊的第一個字節(jié)的虛擬地址。C編譯器把每個指針和類型 信息聯(lián)系起來,以根據(jù)指針類型,生成不同的機(jī)器級代碼來訪問存儲在指針?biāo)赶蛭恢玫闹怠編譯器維護(hù)著這個類型信息,但它生成的機(jī)器級程序并沒有關(guān)于數(shù)據(jù) 類型的信息,它簡單地把每個程序?qū)ο笠暈橐粋€字節(jié)塊,而將程序本身看做一個字節(jié)序列。

    C語言中數(shù)字?jǐn)?shù)據(jù)類型的大小(單位:字節(jié))

    C聲明

    典型32位機(jī)器

    Compad Alpha機(jī)器

    Char

    Short int

    Int

    Long int

    1

    2

    4

    4

    1

    2

    4

    8

    Char *

    4

    8

    Float

    Double

    4

    8

    4

    8

    1.1.1.2.          十六進(jìn)制

    一個字節(jié)的值域,用二進(jìn)制表示為000000002~111111112。十六進(jìn)制表示為0016~FF16。在C中,以0x或0X開頭的數(shù)字被認(rèn)為是16進(jìn)制的值。

    十進(jìn)制數(shù)字x轉(zhuǎn)十六進(jìn)制:【x=q0*16 + r0】->【q0=q1*16 + r1】->……->【rn = 0*16 + r n】,則結(jié)果為【rn rn-1… r2 r1】,當(dāng)然ri要寫成相應(yīng)的十六進(jìn)制數(shù)字。

    1.1.1.3.          尋址和字節(jié)順序

    對跨越多字節(jié)的程序?qū)ο螅覀儽仨毥蓚€規(guī)則:這個對象的地址是什么?我們在存儲器中如何對這些字節(jié)排序?

    答:1.多字節(jié)對象被存儲為連續(xù)的字節(jié)序列,對象的地址為所使用字節(jié)序列中最小的地址。

    2.對表示一個對象的字節(jié)序列排序有兩種規(guī)則,大端法和小端法。大端法:最高有效字節(jié)在最前面;小端法:最低有效字在最前面。如有一個十六進(jìn)制數(shù)字0x01234567,其表示如下表所示:

    大端法


    0x100

    0x101

    0x102

    0x103


    01

    23

    45

    67

    小端法

    0x100

    0x101

    0x102

    0x103


    67

    45

    23

    01

    關(guān)于字節(jié)序在網(wǎng)絡(luò)通信時就變得很重要。由于不同的計算機(jī)可能出現(xiàn)大端法和小端法的區(qū)別,所以在發(fā)送某些數(shù)據(jù)之前需要將數(shù)據(jù)從主機(jī)字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序,而在收到數(shù)據(jù)后,又需要將數(shù)據(jù)從網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換為主機(jī)字節(jié)序進(jìn)行處理。

    打印程序?qū)ο蟮淖止?jié)表示:

    #ifndef SHOW_BYTE_H
    #define SHOW_BYTE_H

    #include 
    <stdio.h>    
    typedef unsigned 
    char *byte_pointer; 
    class CShowBytes
    {
    public:
        
    void show_bytes(byte_pointer start, int len)         
        
    {                                            
            
    int i;                                     
            
    for(i=0; i<len; i++)                        
            
    {                                        
                printf(
    " %.2x", start[i]);                 
            }
                                            
            printf(
    ""n");                                
        }
                                                

        
    void show_int(int x)                             
        
    {                                            
            show_bytes((byte_pointer)
    &x, sizeof(int));     
        }
                                                

        
    void show_float(float x)                         
        
    {                                            
            show_bytes((byte_pointer)
    &x, sizeof(float));     
        }
                                                

        
    void show_pointer(void *x)                         
        
    {                                            
            show_bytes((byte_pointer)
    &x, sizeof(void *));    
        }
        
        
    void show_string(char start[], int len)         
        
    {                                            
            
    int i;                                     
            
    for(i=0; i<len; i++)                        
            
    {                                        
                printf(
    " %.2x", start[i]);                 
            }
                                            
            printf(
    ""n");                                
        }
        
    }
    ;
    #endif


    1.1.1.4.          字符串

    C字符串為以NULL字符結(jié)尾的字符數(shù)組。為什么前面我提到在網(wǎng)絡(luò)通信時,是需要對“某些”數(shù)據(jù)進(jìn)行主機(jī)字節(jié)序和網(wǎng)絡(luò)字節(jié)序之間的轉(zhuǎn)換,而不是所有?是因為字符串具有平臺獨立性。為什么呢?

    因為每個字符都由標(biāo)準(zhǔn)編碼來表示,常用ASCII編碼,如使用ASCII碼的字符碼在任何系統(tǒng)傷 將得到同樣的結(jié)果,與字節(jié)順序和字大小無關(guān)。下圖對比了數(shù)字和字符串在內(nèi)存中的存儲形式,由于一個字符恰好對應(yīng)一個字節(jié),所以與字節(jié)順序沒有關(guān)系,而數(shù)字 的話涉及到位數(shù)先后順序的問題就不同了。

    1.1.1.5.          布爾代數(shù)和環(huán),C的位、邏輯運算

    二進(jìn)制是計算機(jī)編碼、存儲和操作信息的核心。而圍繞0和1的布爾運算和環(huán)結(jié)構(gòu)就變得異常重要。布 爾代數(shù)<{0, 1}, |, &, ~, 0, 1>和基本的算術(shù)運算有很多相似的特性,如交換性、結(jié)合性、同一性等等。紅綠藍(lán)三種基本色在{0,1}中取值,并進(jìn)行不同的布爾運算,就產(chǎn)生出了豐 富多彩的顏色。

    C的位運算和邏輯運算就充分運用到了布爾代數(shù)的知識。記得在網(wǎng)上曾看到一道筆試題,就是交換兩個變量x和y的值,但不要引入第三方的變量,如果布爾代數(shù)運用得好的話,可以很容易給出下面的解決方案。

    void inplace_swap(int *x, int *y)
    {
        
    *= *^ *y;
        
    *= *^ *y;
        
    *= *^ *y;
    }


              其實這兒就運用到了 a ^ a = 0 和 a ^ 0 = a 的性質(zhì)。

         邏輯運算與位運算不同的是,如果第一個參數(shù)能確定表達(dá)式的結(jié)果,就不會對后續(xù)參數(shù)求值進(jìn)行運算。如p&&*p++就不會間接引用空指針。具體原因請參看后面C的匯編表示中關(guān)于邏輯運算的匯編表示部分。

         C的移位運算,左移比較簡單,直接在右邊的空位補(bǔ)0。而右移就不同了,分為邏輯右移和算術(shù)右移兩種,邏輯右移也是直接在左邊的空位補(bǔ)0,而算術(shù)右移則在左 邊的空位補(bǔ)上最高有效位的拷貝。幾乎所有的編譯器/機(jī)器組合都對有符號數(shù)使用算術(shù)右移。移位運算同樣很重要,乘法在Cpu上的執(zhí)行要比加減法多很多指令, 為了提高效率,通常就可以用移位運算對乘法運算進(jìn)行優(yōu)化。

    posted on 2010-09-30 10:04 何克勤 閱讀(163) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 5555在线播放免费播放| 日本免费福利视频| 亚洲AV成人影视在线观看| 免费永久在线观看黄网站| 国产中文字幕在线免费观看| 久久精品九九亚洲精品| 在线看片无码永久免费aⅴ| 中国好声音第二季免费播放| 亚洲天堂福利视频| 亚洲人成网站观看在线播放| 99视频在线免费看| 无忧传媒视频免费观看入口| 亚洲最大黄色网站| 日韩一卡2卡3卡4卡新区亚洲 | 亚洲精品在线免费看| 羞羞视频免费观看| 911精品国产亚洲日本美国韩国 | 可以免费观看的国产视频| 国产精品久久亚洲不卡动漫| 国产成人高清亚洲| 九九九精品成人免费视频| 久久成人a毛片免费观看网站| 亚洲七久久之综合七久久| 亚洲成AV人在线播放无码| 国产精品色午夜免费视频| 亚洲成年人免费网站| 国产免费人成视频尤勿视频| 亚洲国产精品网站在线播放| 亚洲视频在线观看免费| 国产午夜亚洲精品午夜鲁丝片| 在线视频免费观看www动漫| 免费播放一区二区三区| 国产精品黄页免费高清在线观看 | 日韩在线视频免费| 亚洲伊人久久大香线蕉AV| 久久精品亚洲一区二区三区浴池 | 爱情岛论坛免费视频| 亚洲国产熟亚洲女视频| 亚洲欧洲日产国码二区首页| 亚洲国产美女精品久久久久∴| 亚洲国产成人精品91久久久|