大小端

本文介绍如何通过共用体和指针两种方式判断计算机系统的大端或小端存储特性,并提供大小端转换的函数原型。适用于网络编程中数据传输格式的统一处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.判断大端存储还是小端存储?
大端小端只在数据类型的长度超过一个字节时才有意义!
1.1 用共用体的方式

#include<stdio.h>
 
union un
{
	char ch;
	int a;
	short b;
};
 
/*若int占4个字节,那char就在int的最低的那个字节,short就在int的低的
  那两个字节字节。变量都是从低位开始往高位存储,变量的起始地址都是最低
  位。只不过小端序是起始地址存低字节,而大端序是起始地址存高字节。*/
int main(int argc, char **argv)
{
	union un myun;
    printf("%d\n",sizeof(myun));
 
    myun.a = 0x12345678;
      
    if(myun.ch == 0x78) //别忘了0x,写成78就错了!
    {
    	printf("little endian\n");
    }
    else
    {
        printf("big endian\n");
    }
 
    if(myun.b == 0x5678) //别忘了0x,别写成7856!
    {
        printf("little endian\n");
    }
    else
    {
        printf("big endian\n");
    }
    return 0;
 }

在这里插入图片描述
1.2用指针的方式

#include<stdio.h>
 
int main(int argc, char **argv)
{
     int a = 0x12345678;
     char *p = (char*)&a;
 
     if(*p == 0x78)
     {
            printf("little endian\n");
     }
     else
     {
            printf("big endian\n");
     }
 
     printf("p = %p *p = %#X\n",p,*p);
     printf("p+1 = %p *(p+1) = %#X\n",p+1,*(p+1));
     printf("p+2 = %p *(p+2) = %#X\n",p+2,*(p+2));
     printf("p+3 = %p *(p+3) = %#X\n",p+3,*(p+3));
     return 0;
}
             
 解析:
 /*若int占4个字节,那char就在int的最低的那个字节,short就在int的低的那两个字节字节。变量都是从低位开始往高位存储,变量的起始地址都是最低位。只不过小端序是起始地址存低字节,而大端序是起始地址存高字节。*/

在这里插入图片描述
2. 大小端转换函数原型

#define SYS_LITTLE_ENDIAN 1
#define TRUE 1

#if (SYS_LITTLE_ENDIAN == TRUE)
#define NTOHL(x) ((((x) & 0xFF000000)>>24 | ((x) & 0x00FF0000)>>8|\
             (((x) & 0x0000FF00) << 8) | (((x) & 0x000000FF) << 24))

#define NTOHS(x) ((((x) & 0xFF00) >> 8) | (((x) & 0x00FF) << 8))

#define HTONL(x) NTOHL(x)
#define HTONS(x) NTOHS(x)

#else
#define NTOHL(x) (x)
#define NTOHS(x) (x)
#define HTONL(x) (x)
#define HTONS(x) (x)
#endif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值