難記的大端小端
曾經被電面到一個題目,如何判斷一個系統是大端還是小端, 方法其實很簡單
int main(){
	int i = 0x12345678;  // 注意必須是16進制,否則難以判斷
	return *(char*)&i;
}
 
        在linux 的執行結果
gcc test.c          
$./a.out 
$echo $?
120
 
        120 即 0x78, 證明低位放在了低地址,所以是小端系統(little endian )。
 這樣說可能不夠直觀,而且內存中怎么分布本來就比較抽象,所以這里演示打印內存並畫個圖來表示
用gdb 打印內存地址
使用disassemble命令反匯編后,可見我們的i在 -0xc(%rbp) 位置,也就是 %rbp-0xc
│  >0x555555555150 <main+23>                movl   $0x12345678,-0xc(%rbp)                                                            
 
        打印4個字節的內存,用到x命令,方法是 x/fmt,若記不住,只需要在gdb內使用help x
(gdb) x/4xb $rbp - 0xc
0x7fffffffe7c4: 0x78    0x56    0x34    0x12
(gdb) 
 
        4 表示重復4次,x表示顯示為16進制,b表示每次打印的長度為1字節
下面值打印逐步打印一個字節,更清楚
(gdb) x/1xb $rbp - 0xc
0x7fffffffe7c4: 0x78
(gdb) x/1xb $rbp - 0xb
0x7fffffffe7c5: 0x56
(gdb) x/1xb $rbp - 0xa
0x7fffffffe7c6: 0x34
(gdb) x/1xb $rbp - 0x9
0x7fffffffe7c7: 0x12
(gdb) 
 
        畫個圖
| c7 | c6 | c5 | c4 | 
|---|---|---|---|
| 0x12 | 0x34 | 0x56 | 0x78 | 
而我們的i指針地址指的是 c4, 所以c4是端, lsb處在端位置,所以是小端系統, little endian
(gdb) p $rbp - 0xc
$2 = (void *) 0x7fffffffe7c4
 
        也可以看出,系統通過一個地址取值是從低地址取到高地址。 c4 c5 c6 c7
區分endian
搞清楚了端,就很好判斷endian, 給兩個圖理解什么是big endian
 

文章的第一個字母都是比較大, 這叫big endian
總結
Linux 是一個小端系統, windows也是, 可以順便說網絡 字節序是 大端
