日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

C/C++字節(jié)序的深入理解_C 語(yǔ)言

作者:英雄哪里出來(lái) ? 更新時(shí)間: 2022-04-24 編程語(yǔ)言

字節(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)單了,不再累述。

原文鏈接:https://blog.csdn.net/WhereIsHeroFrom/article/details/84643017

欄目分類(lèi)
最近更新