techiall / Blog

🍋 [My Blog] See discussions
https://github.com/techiall/Blog/discussions
MIT License
8 stars 1 forks source link

大端和小端(Big endian and Little endian) #27

Open techiall opened 5 years ago

techiall commented 5 years ago

1537943476417

大端模式,数据的高字节保存在内存的低地址中;

小端模式,数据的高字节保存在内存的高地址中。

首先,为什么会有小端字节序?

答案是,计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。(也就是从低位开始处理数据的称之为小端模式

但是,人类还是习惯读写大端字节序。所以,除了计算机的内部处理,其他的场合几乎都是大端字节序,比如网络传输和文件储存。

http://www.ruanyifeng.com/blog/2016/11/byte-order.html

判断大小端

/*
 * 返回 1 / 0
 * 1 代表 小端
 * 0 代表 大端
 */
bool check() 
{
    int value = 0x12345678;  
    return (*((char *)&value) == 0x78); 
}

一道笔试题目

char *sz = "0123456789"; 
int *p = (int*)sz; 
printf("%x\n",*++p); 

// 字符'0'对应的十六进制是0x30,请问在x86环境下程序输出是多少?
各字符对应地址如下:

0   1   2   3   4   5   6   7   8   9
0x30    0x31    0x32    0x33    0x34    0x35    0x36    0x37    0x38    0x39

因此打印 *++p 的地址,也就相当于打印 4567 的地址。也就是 0x37363534