1)低地址放低位(小端字节序,小端即低位在前)。实际存储为0x78 56 34 12. 使用这种字节序的典型为x86机器,即intel和amd的cpu。
2)低地址放高位(大端字节序)。实际存储为0x12 34 56 78. 其余的厂家一般使用这种字节序。sun,ibm等等。另外网络字节序也是这种,二进制文件如音视频文件中一般也为大端。
在字节内部,一个字节的二进制排序,不存在大小端问题。就和平常书写的一样,先写高位,即低地址存储高位。如char a=0x12.存储从低位到高位就为0001 0010。
字节内部二进制排序的特殊情况,字节被位域分割的话,不同位域会根据cpu的不同采用不同排序(大端或小端)。或者说一个字节内两个或多个位域的排练顺序:从左至右还是从右至左。
例如,在流媒体协议rtp的头部格式为:版本(2bit),填充(1bit),扩展(1bit),csrc计数(4bit),标志(1bit),负载类型(7bit),序列号(16bit),时间戳(32bit)。在intel的机器中,定义头部类型时,应该如下:(intel为小端字节序,而网络流为大端字节序,相反)
- typedef struct
-
{
-
/**//* byte 0 此处,注意顺序与规定相反,在存储的时候,这个字节内部由低位到高位为version,padding,extension,csrc_len*/
-
uint8_t csrc_len:4;
-
uint8_t extension:1;
-
uint8_t padding:1;
-
uint8_t version:2;
-
/**//* byte 1 */
-
uint8_t payload:7;
-
uint8_t marker:1;
-
/**//* bytes 2, 3 */
-
uint16_t seq_no;
-
/**//* bytes 4-7 */
-
uint32_t timestamp;
-
/**//* bytes 8-11 */
-
uint32_t ssrc; /**//* stream number is used here. */
- } RTP_FIXED_HEADER;
另外,上图,位域的顺序的说明,只在一个字节内有效。如果跨越字节,则按照声明的顺序分配。
例2,程序如下:
- #include <stdio.h>
-
int main()
-
{
-
struct bitfield {
-
int ia:2;
-
int ib:6;
-
} field;
-
field.ia=1;
-
field.ib=4;
-
-
char * c;
-
c=(char *)&field;
-
printf("%d\n",*c);
-
getchar();
-
return 1;
- }
在X86上运行结果是17(000100 01),而不是68(01 000100)