对大端法和小端法存储数据的一些理解
直入正题吧~
所谓大端法,就是指数据的高字节放在低地址
所谓小端法,就是指数据的低字节放在低地址
一般,Linux和Windows采用的是小端法表示,Sun是大端法表示。这两种表示其实没区别,但不知道为什么人们总是为之争得面红耳赤…
【对大端法和小端法存储数据的一些理解】现在来做个实验,在Linux64平台和Windows64平台检验其小端性:
测试代码:
#include
#include
using namespace std;
typedef unsigned char* ptr;
void show_bytes(ptr bytes, size_t len) {
for (size_t i = 0;
i < len;
++i) {
printf("%.16x: %.2x\n",bytes+i, bytes[i]);
// 地址+内容
}
cout << "\n";
}int main() {
int ival;
scanf("%d",&ival);
float fval = (float)ival;
int* pval = &ival;
show_bytes((ptr)&ival,sizeof(ival));
show_bytes((ptr)&fval,sizeof(fval));
show_bytes((ptr)&pval,sizeof(pval));
return 0;
}
Linux实验结果
文章图片
12345的十六进制表示为0x00 00 30 39
大端法的表示为:
文章图片
小端法表示为:
文章图片
Linux是小端机器,从上述实验结果得到验证
Windows实验结果
文章图片
与Linux实验结果是一致的,因为它们都是小端法机器
小结:
- 无论是大端法机器还是小端法机器,一个数据都是从低位开始,往高位顺序存储的。如上图大端和小端的图示,十六进制数0x 00 00 30 39 都是从78地址开始存储的。只是在大端和小端的情形下,阅读数据的顺序不同而已。
- 大端和小端仅对连续存储的数据显效(大于等于2个字节)。如果是存放字符串,例如存放0x 30 31 32 33 34 35 36这个字符串,因为每个字符仅占一个字节,所以顺序排布即可,不需要考虑大端和小端。
- 64位机器的指针宽度(字长)验证为64位
- 把int强制转为float,字节会改变
推荐阅读
- 布丽吉特,人生绝对的赢家
- 增长黑客的海盗法则
- 进必趋|进必趋 退必迟,问起对 视勿移
- 艾略特的交易法则“遵循自然规律”
- 对称加密和非对称加密的区别
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- 涉毒患者(新诗)
- 对抗抑郁最好的方法
- 画解算法(1.|画解算法:1. 两数之和)
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。