admin 管理员组文章数量: 887021
大端/小端
- 何为大小端?
大小端模式,是电脑的一种存储模式。
大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,数据从高位往低位放;这和我们的阅读习惯一致。
小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。
- 大小端的由来:
在 乔纳森·斯威夫特 的著名讽刺小说《格列夫游记》中,小人国内部分裂成Big-endian和Little-endian两派,区别在于一派要求从鸡蛋的大头把鸡蛋打破,另一派要求从鸡蛋的小头把鸡蛋打破。斯威夫特借以讽刺英国的政党之争,在计算机工业中指数据储存顺序的分歧。
- 大小端的现象:
#include <stdio.h>
int main()
{unsigned int a = 0x1234;unsigned char b = *(unsigned char*)&a;printf("%x", b);return 0;
}
如上代码:
由于我们的电脑存储方式为小端模式,所以打印的结果如下:
如果我们的电脑存储方式为大端模式,则会输出00
为什么不是12呢?
原因很简单,因为a的类型是unsigned int,那么0x1234只占了2个字节,那么会在前面补上对应字节的0。那么我们打印出的值应该为00
- 判断大小端的方式:
4.1强制类型转换:
上代码!!!
char check_little_endian()
{int i = 0x12345678;char* p = (char*)&i;return (*p == 0x78);
}
int main()
{char ret = check_little_endian();printf("%d", ret);return 0;
}
我们很清楚,虽然指针的大小都是4/8个字节的大小,但是指针影响的是解引用后所读取的字节大小与+1移动的步长有关。
如上:如果最后解引用后,得到的数值为0x78,就会返回1,否则返回0
我们运行后确实得到的是1,那么说明这台机器的存储方式为小端模式。
若返回的是0,就只能说明这台机器的存储方式为大端模式。
4.2联合体(union):
我们知道,联合体与结构体的最大区别就是:结构体的每一个成员都是独立的一块内存,而联合体的内存是可以共用一块内存的。这也正是联合体的一个特性,它十分的节省内存空间。
以下是联合体的特点:
union中可以定义多个成员,union的大小由最大的成员的大小决定 |
union成员共享同一块大小的内存,一次只能使用其中的一个成员 |
对某一个成员赋值,会覆盖其他成员的值 |
联合体union的存放顺序是所有成员都从低地址开始存放 |
那么废话也不多说,直接上代码:
BOOL check_little_endian()
{union{char a;int b;}u;u.b = 0x12345678;return (BOOL)(u.a == 0x78);
}
int main()
{char ret = check_little_endian();printf("%d", ret);return 0;
}
d
本文标签: 大端小端
版权声明:本文标题:大端小端 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1687423240h100887.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论