欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

如何测试机器的大小端

程序员文章站 2022-04-22 13:39:16
...

一、大小端
1、为啥会有大小端
在计算机系统中以字节为单位,每个地址单位都有一个字节(一个字节8个bit位)。在C语言中,有char(8bit)、short(16bit)、long(32bit,具体看编译器)。对于位数大于8的处理器,不如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在一个如何将多个字节安排的问题。so就有了大端存储模式和小端存储模式

2、大小端的概念区分

(1)大端(Big_endian):数据的高字节保存在内存的低地址处,数据的低字节保存在内存的高地址。这个存储模式类似将数据当做字符串处理:地址由小到大增加,数据由高到低存放。
(2)小端(Little_endian):数据的高字节保存在内存的高地址处,数据的低字节保存在内存的低地址。这样子的存储模式和我们逻辑思维方式一样,将地址的高低位和数据权位有效对应起来,高地址对应权值高的,低地址对应权值低的。
如何测试机器的大小端
二、代码测试大小端
(1)联合体union:(Because联合体(union)的存放顺序是所有成员都是从低地址开始存放,这样就可以区分出是大端or小端)

int CheckSystem()
{
      union Check
      {
            //定义两个变量(i和ch),这两个变量共用同一块地址空间,并且两个变量的首地址是一样的
            int i;       
            char ch;
      }c;
      // 将1放到i的低位去
      c.i = 1;
      //倘若ch的最低位是1,则证明机器为小端存储模式;否则反之
      return (c.ch == 1);
}

(2)指针强转解引用:

int CheckSystem()
{
      int i = 1;
      if (*((char *)(&i)) == 1)  // 解释:(&i):取出变量的地址
                                 //(char *)(&i);i变量地址的第一个字节的地址
                                 //*((char *)(&i):解引用取出第一个字节保存的内容
      {
            return 1;
      }
      return 0;
}

完整代码:

#include <stdio.h>
//方法一:联合体union
int CheckSystem()
{
      union Check
      {
            //定义两个变量(i和ch),这两个变量共用同一块地址空间,并且两个变量的首地址是一样的
            int i;       
            char ch;
      }c;
      // 将1放到i的低位去
      c.i = 1;
      //倘若ch的最低位是1,则证明机器为小端存储模式;否则反之
      return (c.ch == 1);
}
// 方法二:强转指针并且解引用
int CheckSystem()
{
      int i = 1;
      if (*((char *)(&i)) == 1)  // 解释:(&i):取出变量的地址
                                 //(char *)(&i);i变量地址的第一个字节的地址
                                 //*((char *)(&i):解引用取出第一个字节保存的内容
      {
            return 1;
      }
      return 0;
}
int main()
{
      int ret = CheckSystem();  //定义一个返回值
      printf("ret: %d\n", ret);
      system("pause");
      return 0;
}

经过测试,小可爱我的机器是小端存储模式哦,你的嘞???

相关标签: 大小端