㈠ 大端模式和小端模式的区别及如何判断的存储器的模式
一个数需要超过一个字节来存储时,就有大端和小端的区别,只用一个字节时,无所谓大小端
低位的放在低地址,也就是小个在前,叫小端,反之叫大端
c和c++需要面对这样的问题,java等高级语言已经屏蔽这个差异,不需要额外处理
在c中,可以用以下代码片段来判断是大端还是小端
union {char c; int i;} u;
u.i = 1;
if(u.c == 1){//小端}
else{//大端}
㈡ 大端模式和小端模式
具体如下:
1、大端模式:
大端模式,是指数据的高位,保存在内存的低地址中,而数据的低位,保存在内存的高地址中,这样的存储模式类似于把数据当作字符串顺序处理。
地址由小向大增加,而数据从高位往低位放;小端模式,是指数据的高位保存在内存的高地址中,而数据的低位保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。
在大端模式下,前16位应该这样读: e6 84 6c 4e ( 假设int占4个字节)。
记忆方法: 地址的增长顺序与值的增长顺序相反。
2、小端模式例子:
0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000。
0000440: b484 6c4e 004e ed00 0000 0000 0100 0000。
在小端模式下,前16位应该这样读: 4e 6c 84 e6( 假设int占4个字节)。
记忆方法: 地址的增长顺序与值的增长顺序相同。
大小端模式:
为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于 8位的处理器。
例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。
对于 大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。
㈢ java网络编程是大端还是小端
网络传输中采用的大端标记法,也就是说先传比较高权值的数字, 就像 12一样,先传10,在传2,就算丢了后面一个,损失也不是太大。
小端就跟机器有关了。你在封装一个int之类的数字,封装进去之后就应该是大端的了,可以调用里面的 htons() 或者htonl()函数来转化成大端的(当然你也可以自己按照大端的方式封装,就会麻烦一点而已)。传输过程中当然也是大端的,接受到的buffer里面当然也是大端的,但是你在读取这个int类型的时候,就需要相应的将大端转化为小端了(采用ntohs() 函数或ntohl()函数来实现),这样你读取到的就是原来的数字。
可想而知,假如你用机器A和B通信,而且A和B的端序都是一样的话,中间自然就不用转换来转换去了。但是这不是好习惯,因为假如移植到另外端序的机器的话就需要修改代码笭害蒂轿郦计垫袭叮陋。所以最好还是用那几个函数。
㈣ 大小端模式的简介
所谓的大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;
例子:
0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000
0000440: b484 6c4e 004e ed00 0000 0000 0100 0000
在大端模式下,前32位应该这样读: e6 84 6c 4e ( 假设int占4个字节)
记忆方法: 地址的增长顺序与值的增长顺序相同 所谓的小端模式(Little-endian),是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。
例子:
0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000
0000440: b484 6c4e 004e ed00 0000 0000 0100 0000
在小端模式下,前32位应该这样读: 4e 6c 84 e6( 假设int占4个字节)
记忆方法: 地址的增长顺序与值的增长顺序相反 对于0x11223344 储存如下
下面这段代码可以用来测试一下你的编译器是大端模式还是小端模式:
short int x;
char x0,x1;
x=0x1122;
x0=((char*)&x)[0]; //低地址单元
x1=((char*)&x)[1]; //高地址单元
若x0=0x11,则是大端; 若x0=0x22,则是小端......
上面的程序还可以看出,数据寻址时,用的是低位字节的地址。 #definesw16(x)((short)((((short)(x)&(short)0x00ffU)<<8)|(((short)(x)&(short)0xff00U)>>8)))
㈤ 字节序大端、小端
一、定义:
大端模式(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协议规定:把接收到的第一个字节当作高位字节看待,这就要求发送端发送的第一个字节是高位字节;而在发送端发送数据时,发送的第一个字节是该数值在内存中的起始地址处对应的那个字节,也就是说,该数值在内存中的起始地址处对应的那个字节就是要发送的第一个高位字节(即:高位字节存放在低地址处);由此可见,多字节数值在发送之前,在内存中因该是以大端法存放的; 所以说,网络字节序是大端字节序; 在实际中,当在两个存储方式不同的主机上传输时,需要借助字节序转换函数。