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

本文标签: 大端小端