C/C++字節(jié)序的深入理解
字節(jié)序
最近在看 redis 的內(nèi)存編碼,里面涉及到字節(jié)序相關(guān)的內(nèi)容。這里就當復(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)存排布。

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

主機字節(jié)序和網(wǎng)絡(luò)字節(jié)序
除了主機字節(jié)序,還有網(wǎng)絡(luò)字節(jié)序。主機字節(jié)序由CPU決定,Intel Core 經(jīng)測試都是小端字節(jié)序。而網(wǎng)絡(luò)字節(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;
} 取得整數(shù) x 的首地址轉(zhuǎn)換成 unsigned char* 指針后再向前偏移 i 個單位,分別得到這 sizeof(int) 個字節(jié)的地址,然后用 * 取得每個地址上的值,通過位運算轉(zhuǎn)換成 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
大端序和小端序的互轉(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é)序進行轉(zhuǎn)換的時候:
第0個字節(jié)和第7個字節(jié)交換;
第1個字節(jié)和第6個字節(jié)交換;
第2個字節(jié)和第5個字節(jié)交換;
第3個字節(jié)和第4個字節(jié)交換;
對于 32位整數(shù)、16位整數(shù)的情況,就更加簡單了,不再累述。
到此這篇關(guān)于C/C++字節(jié)序的深入理解的文章就介紹到這了,更多相關(guān)C語言 字節(jié)序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++結(jié)構(gòu)體初始化的10種寫法總結(jié)
這篇文章主要為大家詳細介紹了10種C++中結(jié)構(gòu)體初始化的寫法,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04
C語言使用函數(shù)實現(xiàn)字符串部分復(fù)制問題
這篇文章主要介紹了C語言使用函數(shù)實現(xiàn)字符串部分復(fù)制問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11
C++實現(xiàn)字符串元音字母反轉(zhuǎn)的兩種方法
在處理字符串問題時,我們經(jīng)常需要對其中的字符進行操作,例如反轉(zhuǎn)、替換等,本文將詳細討論如何在C++中實現(xiàn)僅反轉(zhuǎn)字符串中的所有元音字母,并返回結(jié)果字符串,需要的朋友可以參考下2024-07-07
Species Tree 利用HashTable實現(xiàn)實例代碼
這篇文章主要介紹了Species Tree 利用HashTable實現(xiàn)實例代碼的相關(guān)資料,需要的朋友可以參考下2017-01-01

