欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C/C++字節(jié)序的深入理解

 更新時(shí)間:2022年02月20日 11:47:17   作者:英雄哪里出來(lái)  
本文主要介紹了C/C++字節(jié)序的深入理解,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

字節(jié)序

        最近在看 redis 的內(nèi)存編碼,里面涉及到字節(jié)序相關(guān)的內(nèi)容。這里就當(dāng)復(fù)習(xí)一下,做個(gè)簡(jiǎn)單的回顧。

        數(shù)據(jù)存儲(chǔ)在內(nèi)存中,是以字節(jié)為單位的,如果是單字節(jié)數(shù)據(jù)(如char、unsigned char、int8)就不會(huì)有字節(jié)序的問(wèn)題。但是多字節(jié)數(shù)據(jù)(如 int、float、double)就要考慮字節(jié)序的問(wèn)題了。字節(jié)序共分為兩種:大端序 和 小端序。

大端序

        數(shù)據(jù)的高位字節(jié)存儲(chǔ)在地址的低端;低位字節(jié)存儲(chǔ)在地址的高端。如圖所示,值為 0x12345678 的四字節(jié)整數(shù)在大端序的主機(jī)上的內(nèi)存排布。

小端序

        數(shù)據(jù)的高位字節(jié)存儲(chǔ)在地址的高端;低位字節(jié)存儲(chǔ)在地址的低端。如圖所示,值為 0x12345678 的四字節(jié)整數(shù)在小端序的主機(jī)上的內(nèi)存排布。

主機(jī)字節(jié)序和網(wǎng)絡(luò)字節(jié)序

         除了主機(jī)字節(jié)序,還有網(wǎng)絡(luò)字節(jié)序。主機(jī)字節(jié)序由CPU決定,Intel Core 經(jīng)測(cè)試都是小端字節(jié)序。而網(wǎng)絡(luò)字節(jié)序采用的是大端序。測(cè)試字節(jié)序可以通過(guò)一段 C 的源碼搞定。

#include <stdio.h>
 
int main(int argc, char *argv[]) {
    int i;
    int x = 0x12345678;
    for (i = 0; i < sizeof(int); ++i) {
        unsigned char *p = ((unsigned char *)(&x)) + i;
        unsigned char v = *p;
        printf("%p 0x%d%d\n", p, v>>4, v & 0xf );
    }
    return 0;
}

         取得整數(shù) x 的首地址轉(zhuǎn)換成 unsigned char* 指針后再向前偏移 i 個(gè)單位,分別得到這 sizeof(int) 個(gè)字節(jié)的地址,然后用 * 取得每個(gè)地址上的值,通過(guò)位運(yùn)算轉(zhuǎn)換成 16進(jìn)制 輸出。
         Linux 系統(tǒng)可以通過(guò)指令獲取 CPU 的類(lèi)型:

cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
4  Intel(R) Core(TM) i3-2120 CPU @ 3.30GHz

大端序和小端序的互轉(zhuǎn)

        大端序和小端序的互相轉(zhuǎn)換,其實(shí)就是內(nèi)存翻轉(zhuǎn),在知道一個(gè)整數(shù)或者一個(gè)指針的字節(jié)數(shù)的時(shí)候,就是做一個(gè)鏡像的交換。這里以 64位 整型為例:

void memrev64(void *p) {
    unsigned char *x = p, t;
 
    t = x[0];
    x[0] = x[7];
    x[7] = t;
    t = x[1];
    x[1] = x[6];
    x[6] = t;
    t = x[2];
    x[2] = x[5];
    x[5] = t;
    t = x[3];
    x[3] = x[4];
    x[4] = t;
}
 
uint64_t intrev64(uint64_t v) {
    memrev64(&v);
    return v;
}

        64位整數(shù)的字節(jié)數(shù)為8,所以在字節(jié)序進(jìn)行轉(zhuǎn)換的時(shí)候:
        第0個(gè)字節(jié)和第7個(gè)字節(jié)交換;
        第1個(gè)字節(jié)和第6個(gè)字節(jié)交換;
        第2個(gè)字節(jié)和第5個(gè)字節(jié)交換;
        第3個(gè)字節(jié)和第4個(gè)字節(jié)交換;
        對(duì)于 32位整數(shù)、16位整數(shù)的情況,就更加簡(jiǎn)單了,不再累述。

到此這篇關(guān)于C/C++字節(jié)序的深入理解的文章就介紹到這了,更多相關(guān)C語(yǔ)言 字節(jié)序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++命名空間使用詳細(xì)介紹

    C++命名空間使用詳細(xì)介紹

    考慮一種情況,當(dāng)我們有兩個(gè)同名的人,Zara,在同一個(gè)班里。當(dāng)我們需要對(duì)它們進(jìn)行區(qū)分我們必須使用一些額外的信息和它們的名字,比如它們生活在不同的區(qū)域或者興趣愛(ài)好什么的,在C++程序中也會(huì)遇到同樣的情況,所以命名空間就此產(chǎn)生
    2022-09-09
  • C語(yǔ)言實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng)課程設(shè)計(jì)

    C語(yǔ)言實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng)課程設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • C++?pimpl機(jī)制詳細(xì)講解

    C++?pimpl機(jī)制詳細(xì)講解

    PIMPL?是?C++?中的一個(gè)編程技巧,意思為指向?qū)崿F(xiàn)的指針。具體操作是把類(lèi)的實(shí)現(xiàn)細(xì)節(jié)放到一個(gè)單獨(dú)的類(lèi)中,并用一個(gè)指針進(jìn)行訪問(wèn)
    2022-08-08
  • C語(yǔ)言 遞歸解決青蛙跳臺(tái)階問(wèn)題

    C語(yǔ)言 遞歸解決青蛙跳臺(tái)階問(wèn)題

    遞歸做為一種算法在程序設(shè)計(jì)語(yǔ)言中廣泛應(yīng)用?;竞x&#8203;是指函數(shù)/過(guò)程/子程序在運(yùn)行過(guò)程序中直接或間接調(diào)用自身而產(chǎn)生的重入現(xiàn)象。在計(jì)算機(jī)編程里,遞歸指的是一個(gè)過(guò)程:函數(shù)不斷引用自身,直到引用的對(duì)象已知
    2021-11-11
  • C++實(shí)現(xiàn)簡(jiǎn)單校園導(dǎo)游系統(tǒng)

    C++實(shí)現(xiàn)簡(jiǎn)單校園導(dǎo)游系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單校園導(dǎo)游系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++類(lèi)中的特殊成員函數(shù)示例詳解

    C++類(lèi)中的特殊成員函數(shù)示例詳解

    這篇文章主要給大家介紹了關(guān)于C++類(lèi)中特殊成員函數(shù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • Dijkstra最短路徑算法實(shí)現(xiàn)代碼

    Dijkstra最短路徑算法實(shí)現(xiàn)代碼

    這篇文章主要介紹了Dijkstra最短路徑算法實(shí)現(xiàn)代碼,有需要的朋友可以參考一下
    2013-12-12
  • C++設(shè)計(jì)模式之狀態(tài)模式

    C++設(shè)計(jì)模式之狀態(tài)模式

    這篇文章主要介紹了C++設(shè)計(jì)模式之狀態(tài)模式,本文講解了什么是狀態(tài)模式、狀態(tài)模式的使用場(chǎng)合、狀態(tài)模式的實(shí)現(xiàn)代碼等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • C++核心編程之占位參數(shù)和默認(rèn)參數(shù)

    C++核心編程之占位參數(shù)和默認(rèn)參數(shù)

    這篇文章主要介紹了C++核心編程之占位參數(shù)和默認(rèn)參數(shù),c++中函數(shù)的形參列表中的形參是可以有默認(rèn)值的,函數(shù)的形參列表里可以有占位參數(shù),用來(lái)占位,調(diào)用函數(shù)時(shí)必須填補(bǔ)位置。下面更多相關(guān)內(nèi)容的詳細(xì)介紹,需要的小伙伴可以參考一下
    2022-03-03
  • 詳解C++中OpenSSL動(dòng)態(tài)鏈接庫(kù)的使用

    詳解C++中OpenSSL動(dòng)態(tài)鏈接庫(kù)的使用

    這篇文章主要介紹了OpenSSL動(dòng)態(tài)鏈接庫(kù)的使用,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11

最新評(píng)論