检测系统的字节顺序【大端模式 | 小端模式】
检测系统的字节顺序【大端模式 | 小端模式】
大(小)端模式:
大端模式是指数据的高位,保存在内存的低地址中,而数据的低位,保存在内存的高地址中,
这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;
小端模式与“大端模式”相反,数据的高位保存在内存的高地址中,数据的地位保存在内存的低地址中。
例如:
我把 0x0102 存入一个 short 短整形(2个字节)中,如果低地址中存放的是 2, 而高地址中存放的是 1,那么就是小端模式,
反之则是大端模式。
描述系统属性的结构体:
struct utsname { char sysname[]; /* Operating system name (e.g., "Linux") */ char nodename[]; /* Name within "some implementation-defined network" */ char release[]; /* OS release (e.g., "2.6.28") */ char version[]; /* OS version */ char machine[]; /* Hardware identifier */ #ifdef _GNU_SOURCE char domainname[]; /* NIS or YP domain name */ #endif };
相关函数:
/* Put information about the system in NAME. */ extern int uname (struct utsname *__name) __THROW;
测试代码:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <sys/utsname.h> 4 5 int main() 6 { 7 union{ 8 short inum; 9 char c[sizeof(short)]; 10 }un; 11 12 struct utsname uts; 13 14 un.inum = 0x0102; 15 16 /* 获取系统信息 */ 17 if(uname(&uts) < 0) 18 { 19 printf("Can't get the host information ...\n"); 20 exit(-1); 21 } 22 23 printf("%s-%s-%s: ", uts.machine, uts.sysname, uts.release); 24 25 /* 如果 short 不是两个字节 */ 26 if(sizeof(short) != 2) 27 { 28 printf("sizoef short = %d\n", sizeof(short)); 29 exit(0); 30 } 31 32 /* 小端模式 */ 33 if(un.c[0] == 2 && un.c[1] == 1) 34 printf("Little_endian !\n"); 35 /* 大端模式 */ 36 else if(un.c[0] == 1 && un.c[1] == 2) 37 printf("Big_endian !\n"); 38 else 39 printf("unknow !\n"); 40 41 return 0; 42 }
运行截图:
当然,不同的系统,得到的结果可能不同!