您的位置:首页 > 其它

字节序问题

2015-09-02 20:25 316 查看
  字节序由处理器决定,它分为两大阵营,一方以Intel为代表,其处理器的字节序是小尾端模式,即低地址存储数据的低位部分,高地址存储数据的高位部分;另一方以IBM为代表,其处理器的字节序是大尾端模式,即低地址存储数据的高位部分,高地址存储数据的低位部分。可用以下的简单代码测试CPU的大小端,小段输出0x78,大端0x12

#include <stdio.h>
int main()
{
int i = 0x12345678;
char *p = &i;
printf("%x\n", p);
return 0;
}


  结构体的位域成员变量

  为了节省空间,如果结构体有几个成员变量的取值范围很小,那么可以考虑将它们合并在一个字节里或一个short、int变量里。使用一个类型超过一个字节的变量时,需要考虑字节序,那么在结构体中使用位域时,需不需要考虑bit序呢?即一个整形变量内包含多个位域变量,各变量的bit顺序是不是固定的呢?通过测试发现,各CPU体系结构的位域bit序跟其字节序大小端是一致的。

  

 网络字节序

  TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节。如果主机是小端字节序,发送和接受都需要做转换。同理,32位的IP地址也要考虑网络字节序和主机字节序的问题。

  可用以下库函数做网络字节序和主机字节序的转换,使网络程序可移植:

#include <arpa/inet.h>

uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: