午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

從長整型數(shù)據(jù)取字節(jié)

 新用戶79878317 2021-07-19

1 移位(占內(nèi)存,移植性一般)

2 強(qiáng)制轉(zhuǎn)換(方便,移植性差)

3 宏定義(易讀,移植性好)

#define ToByte(x, i) (((char*)(&x))[i]) 
x表示數(shù)據(jù),i表示字節(jié)號

4 聯(lián)合體

union
{
  unsigned long dw;
  struck
  {
    unsigned char b0;
    unsigned char b1;
    unsigned char b2;
    unsigned char b3;
  } byte;
} value;
訪問時直接,方便,如value.dw,value.byte.b0等

5 聯(lián)合體+宏定義

#define value     value.dw   
#define value_0 value.byte.b0
#define value_1 value.byte.b1
#define value_2 value.byte.b2
#define value_3 value.byte.b3
直觀,使用方便

           剛剛在討論字節(jié)序的問題的時候出現(xiàn)了這么一個問題,怎么訪問一個整型變量里面的各個字節(jié),我們知道,如果要訪問這個整型最低地址一個字節(jié)的數(shù)據(jù)的話,可以通過如下方式:

                          char a  =  *(char*)&整型變量名;

    這里先將整型數(shù)通過取地址符號獲得變量的開始的地址,為什么要(char*)進(jìn)行強(qiáng)制類型轉(zhuǎn)換呢,因為對于整型數(shù)據(jù)的話,表示的就是以首地址開始的4個字節(jié),它是一個整體,取它的地址后,地址對應(yīng)的類型為int*類型,即如果通過這個指針訪問的話,只能訪問到整個4個字節(jié)的空間的數(shù)據(jù),沒法訪問單個字節(jié)。通過(char*)就將int*整型指針類型轉(zhuǎn)換為字符型指針類型。這樣就可以訪問低地址這個字節(jié)的數(shù)據(jù)啦。那么如果我想訪問第2個,第3個,第4個字節(jié)的數(shù)據(jù)呢。我們先來看看以下表示:

                          char * pc = (char*)&整型變量名;

   pc現(xiàn)在指向首字節(jié),要訪問下個字節(jié)只需要*(p+1)就可以(即p[1]),同理下一個*(p+2)、*(p+3)(p[2]、p[3])。那如果我們不進(jìn)行指針轉(zhuǎn)換呢。我們看如下表示:

                         int *  pi  = &整型變量名;

   這個時候用*pi將獲得四個字節(jié)的內(nèi)容。pi+1將指向下一個整型地址空間,即0x0005地址,所以*(pi+1)(即pi[1])將訪問0x0005地址開始的四個字節(jié)的內(nèi)容。這里有點(diǎn)需要強(qiáng)調(diào)的是,*(pi+i)總是等于pi[i]。整個過程如下圖所示:

指針加1的差別

圖一:指針加1的差別

    通過上面的分析,想獲得一個整型數(shù)里面的某個字節(jié)的值的話,我們可以如下表示:

char a  =  ((char*)&整型變量名)[i];

    i=0表示首字節(jié),1表示第2個字節(jié),依次類推。


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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多