重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
什么是大/小端呢?所谓大端就是指高位值在内存中放低位地址,所谓小端是指低位值在内存中放低位地址。比如0x11223344在大端机上是11223344,在小端机上是44332211,而一个机器是大端还是小端要看cpu类型以及运行在上面的操作系统。同一款cpu在不同的操作系统使用的大小端情况是不同的。当然我们通常使用的x86+windows是小端。
十载的广西网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。全网营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整广西建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联从事“广西网站设计”,“广西网站推广”以来,每个客户项目都认真落实执行。
那如何测试大小端呢?
通常的技巧是使用一个指针:如:
[cpp] view plaincopy
int x = 1;
if(*(char *)x == 1)
printf("little-endian\n");
else printf("big-endian\n");
或者使用union的特性。union是一个联合体,所有变量公用一块内存,只是在不同的时候解释不同。其在内存中存储是按最长的那个变量所需要的位数来开辟内存的。如:
[cpp] view plaincopy
#include iostream
using namespace std;
union
{
int number;
char s;
}unionTest;
bool IsBigEndin()
{
unionTest.number = 0x01000002;
return (unionTest.s == 0x01);
}
void main()
{
if (IsBigEndin())
cout"big-endian"endl;
else
cout"little-endian"endl;
}
如何确认系统是采用大端还是小端**
1、大小端
**大端(存储)模式:**是指一个数据的低位字节序的内容放在高地址处,高位字节序存的内容放在低地址处。
如:一个数0x12345678存放在一个4字节空间里
**小端(存储)模式:**是指一个数据的低位字节序内容存放在低地址处,高位字节序的内容存放在高地址处。(可以总结为“小小小”即低位、低地址、小端)
如:一个数0x12345678存放在一个4字节空间里
在计算机系统中,我们是以字节为单位存放数据的,每个地址单元都对应着一个字节,一个字节为8bit。但在C语言中存在不同的数据类型,占用的字节数也各不相同,那么就存在怎样存放多个字节的问题,因此就出现了大端存储模式和小端存储模式。
大小端是由CPU和操作系统来决定的,在操作系统中,x86和一般的OS(如windows,FreeBSD,Linux)使用的是小端模式,但比如Mac OS是大端模式。
知道为什么有模式的存在,下面需要了解下具有有什么应用场景:
1)不同端模式的处理器进行数据传递时必须要考虑端模式的不同
2)在网络上传输数据时,由于数据传输的两端对应不同的硬件平台,采用的存储字节顺序可能不一致。所以在TCP/IP协议规定了在网络上必须采用网络字节顺序,也就是大端模式。对于char型数据只占一个字节,无所谓大端和小端。而对于非char类型数据,必须在数据发送到网络上之前将其转换成大端模式。接收网络数据时按符合接受主机的环境接收。
2、如果知道当前系统是采用的什么模式:
1)
通过查看一个变量在内存中存放的位置来判断
int test1_endian() {
int i = 1;
char *a = (char *)i;
if (*a == 1)
printf("小端\n");
else
printf("大端\n");
return 0;
}
2、用联合体
int test2_endian() {
union {
int i;
char c;
}un;
un.i = 1;
if(un.c == 1) {
printf("小端");
}
else {
printf("大端");
}
return 0;
}
字节序不是由操作系统决定的,而是由cpu架构决定的,比如 x86 的是 little endian,而 PPC (PowerPC) 是big endian。 所以跑在 x86 上的 linux/windows 都是小端,而跑在 PPC 上的linux则是大端。 (PS: 实际上 PowerPC 是即支持大端也支持小端,但是由于历史原因默认用大端)
都可以
网络传输中采用的大端标记法,也就是说先传比较高权值的数字, 就像 12一样,先传10,在传2,就算丢了后面一个,损失也不是太大。
小端就跟机器有关了。你在封装一个int之类的数字,封装进去之后就应该是大端的了,可以调用里面的 htons() 或者htonl()函数来转化成大端的(当然你也可以自己按照大端的方式封装,就会麻烦一点而已)。传输过程中当然也是大端的,接受到的buffer里面当然也是大端的,但是你在读取这个int类型的时候,就需要相应的将大端转化为小端了(采用ntohs() 函数或ntohl()函数来实现),这样你读取到的就是原来的数字。
可想而知,假如你用机器A和B通信,而且A和B的端序都是一样的话,中间自然就不用转换来转换去了。但是这不是好习惯,因为假如移植到另外端序的机器的话就需要修改代码笭害蒂轿郦计垫袭叮陋。所以最好还是用那几个函数。