亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

字節(jié)序

        最近在看 redis 的內存編碼,里面涉及到字節(jié)序相關的內容。這里就當復習一下,做個簡單的回顧。

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

大端序

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

小端序

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

主機字節(jié)序和網絡字節(jié)序

         除了主機字節(jié)序,還有網絡字節(jié)序。主機字節(jié)序由CPU決定,Intel Core 經測試都是小端字節(jié)序。而網絡字節(jié)序采用的是大端序。測試字節(jié)序可以通過一段 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;
}

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

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

大端序和小端序的互轉

        大端序和小端序的互相轉換,其實就是內存翻轉,在知道一個整數或者一個指針的字節(jié)數的時候,就是做一個鏡像的交換。這里以 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位整數的字節(jié)數為8,所以在字節(jié)序進行轉換的時候:
        第0個字節(jié)和第7個字節(jié)交換;
        第1個字節(jié)和第6個字節(jié)交換;
        第2個字節(jié)和第5個字節(jié)交換;
        第3個字節(jié)和第4個字節(jié)交換;
        對于 32位整數、16位整數的情況,就更加簡單了,不再累述。

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

相關文章

  • C++命名空間使用詳細介紹

    C++命名空間使用詳細介紹

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

    C語言實現(xiàn)學生學籍管理系統(tǒng)課程設計

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

    C++?pimpl機制詳細講解

    PIMPL?是?C++?中的一個編程技巧,意思為指向實現(xiàn)的指針。具體操作是把類的實現(xiàn)細節(jié)放到一個單獨的類中,并用一個指針進行訪問
    2022-08-08
  • C語言 遞歸解決青蛙跳臺階問題

    C語言 遞歸解決青蛙跳臺階問題

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

    C++實現(xiàn)簡單校園導游系統(tǒng)

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

    C++類中的特殊成員函數示例詳解

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

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

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

    C++設計模式之狀態(tài)模式

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

    C++核心編程之占位參數和默認參數

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

    詳解C++中OpenSSL動態(tài)鏈接庫的使用

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

最新評論