<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.    信息存儲(chǔ)

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

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

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

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

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

    1.1.1.1.          基本概念:

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

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

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

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

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

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

    一個(gè)字節(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ū)ο螅覀儽仨毥蓚€(gè)規(guī)則:這個(gè)對象的地址是什么?我們在存儲(chǔ)器中如何對這些字節(jié)排序?

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

    2.對表示一個(gè)對象的字節(jié)序列排序有兩種規(guī)則,大端法和小端法。大端法:最高有效字節(jié)在最前面;小端法:最低有效字在最前面。如有一個(gè)十六進(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ò)通信時(shí)就變得很重要。由于不同的計(jì)算機(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í),是需要對“某些”數(shù)據(jù)進(jìn)行主機(jī)字節(jié)序和網(wǎng)絡(luò)字節(jié)序之間的轉(zhuǎn)換,而不是所有?是因?yàn)樽址哂衅脚_(tái)獨(dú)立性。為什么呢?

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

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

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

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

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


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

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

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

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

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 免费一级大黄特色大片| 在线成人爽a毛片免费软件| 亚洲午夜日韩高清一区 | 亚洲欧洲日产国码av系列天堂| 你懂的网址免费国产| 亚洲人成网网址在线看| 亚洲VA综合VA国产产VA中| 亚洲熟妇成人精品一区| 最近免费中文字幕大全高清大全1 最近免费中文字幕mv在线电影 | 国产在线98福利播放视频免费| 国产特黄一级一片免费| 亚洲成AⅤ人影院在线观看| 日韩视频免费在线观看| 亚洲高清乱码午夜电影网| 亚洲狠狠婷婷综合久久久久| 猫咪社区免费资源在线观看| 免费人成视频在线播放| 亚洲国产精品综合久久久| 国产成人亚洲精品影院| 四虎影院免费视频| 99精品视频在线观看免费播放| 亚洲电影在线播放| 在线免费观看你懂的| 免费看黄网站在线看| 亚洲va成无码人在线观看| 亚洲色无码专区在线观看| 午夜毛片不卡高清免费| 99久久免费观看| GOGOGO免费观看国语| 久久精品国产亚洲av天美18| 亚洲人成人77777网站不卡| 亚洲人成人网站色www| 国产精品久久香蕉免费播放| 无码国产精品一区二区免费式影视| 在线看片免费人成视频福利| 久久久久亚洲av无码尤物| 亚洲午夜激情视频| www国产亚洲精品久久久日本| 无码永久免费AV网站| 91香焦国产线观看看免费| 国产综合免费精品久久久|