
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
}
一、定义:
大端模式(Big Endian):数据的高字节,保存在内存的低地址中;数据的低字节,保存在内存的高地址中。
小端模式(Little Endian):数据的高字节,保存在内存的高地址中;数据的低字节,保存在内存的低地址中。
例如:数字0x12 34 56 78在内存中的表示形式为:
1)大端模式:
低地址 ----------------->高地址
0x12 | 0x34 | 0x56 | 0x78
2)小端模式:
低地址 ------------------>高地址
0x78 | 0x56 | 0x34 | 0x12
可见,大端模式和字符串的存储模式类似。
二、如何判断机器的字节序
通过将int强制类型转换成char单字节,通过判断起始存储位置。即等于 取b等于a的低地址部分
联合体union的存放顺序是所有成员都从低地址开始存放,利用该特性可以轻松地获得了CPU对内存采用Little-endian还是Big-endian模式读写
三、网络字节序
网络上传输的数据都是字节流,对于一个多字节数值,在进行网络传输的时候,先传递哪个字节?也就是说,当接收端收到第一个字节的时候,它将这个字节作为高位字节还是低位字节处理,是一个比较有意义的问题UDP/TCP/IP协议规定:把接收到的第一个字节当作高位字节看待,这就要求发送端发送的第一个字节是高位字节而在发送端发送数据时,发送的第一个字节是该数值在内存中的起始地址处对应的那个字节,也就是说,该数值在内存中的起始地址处对应的那个字节就是要发送的第一个高位字节(即:高位字节存放在低地址处)由此可见,多字节数值在发送之前,在内存中因该是以大端法存放的所以说,网络字节序是大端字节序在实际中,当在两个存储方式不同的主机上传输时,需要借助字节序转换函数。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)