溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C/C++字節(jié)序?qū)嵗治?/h1>
發(fā)布時間:2022-02-21 09:21:57 來源:億速云 閱讀:125 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“C/C++字節(jié)序?qū)嵗治觥?,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“C/C++字節(jié)序?qū)嵗治觥卑桑?/p>

字節(jié)序

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

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

大端序

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

C/C++字節(jié)序?qū)嵗治?></p><h3>小端序</h3><p>        數(shù)據(jù)的高位字節(jié)存儲在地址的高端;低位字節(jié)存儲在地址的低端。如圖所示,值為 0x12345678 的四字節(jié)整數(shù)在小端序的主機上的內(nèi)存排布。</p><p><img src=#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 個單位,分別得到這 sizeof(int) 個字節(jié)的地址,然后用 * 取得每個地址上的值,通過位運算轉(zhuǎn)換成 16進(jìn)制 輸出。
         Linux 系統(tǒng)可以通過指令獲取 CPU 的類型:

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

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

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

感謝各位的閱讀,以上就是“C/C++字節(jié)序?qū)嵗治觥钡膬?nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對C/C++字節(jié)序?qū)嵗治鲞@一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI