如何测试机器的大小端

标签: 大小端
7人阅读 评论(0) 收藏 举报
分类:

一、大小端
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;
}

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

查看评论

测试机器大小端的方法

首先,给出一些大小端相关概念。大小端的由来: 在乔纳森·斯威夫特的著名讽刺小说《格列夫游记》中,小人国内部分裂成Big-endian和Little-endian两派,区别在于一派要求从鸡蛋的大头把鸡...
  • ljx_5489464
  • ljx_5489464
  • 2016-03-10 09:29:06
  • 896

如何简单的判断机器的大小端字节序

大端字节序:高字节存放在低地址,低字节存放在高低址 小端字节序:低字节存放在高低址,高字节存放在低地址 大小端字节顺序它是CPU的属性,所哟不同的CPU的大小端字节顺序也不同,移植的时候需要先判断当前...
  • zxnsirius
  • zxnsirius
  • 2016-03-31 19:58:28
  • 1317

利用“共用体”(union)判断机器大小端

利用“共用体”(union)判断机器大小端
  • jackhenry
  • jackhenry
  • 2010-10-19 23:13:00
  • 2839

关于机器大小端的判定

关于大小端:              (本人在这个大小端问题上栽倒好多次了)         大端存储:高字节存储在低地址中,即高位先存;         小端存储:低字节存储在高地址中,即低...
  • bitboss
  • bitboss
  • 2016-04-26 20:07:42
  • 1279

CPU大小端字节序的检测

机器的字节序有两种,即大端字节序和小端字节序。     大端字节序:在内存中,低地址存放数据的高位,高地址存放数据的低位     小端字节序:在内存中,低地址存放数据的低位,高地址存放数据...
  • u013427969
  • u013427969
  • 2015-07-27 18:21:37
  • 444

判断机器大小端的两种实现方法

大端模式: 是指数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位,保存在内存的低地址 中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低...
  • My_heart_
  • My_heart_
  • 2016-06-17 19:42:49
  • 2888

判断大小端的方法(java和c++)

今天看到面经说了判断大小端的程序,首先,我们给出大小端的定义: 小端:较高的有效字节存放在较高的的存储器地址,较低的有效字节存放在较低的存储器地址。 大端:较高的有效字节存放在较低的存储器地址,较低...
  • wang57389675
  • wang57389675
  • 2016-09-13 17:22:42
  • 1804

C语言怎么简单测试为大小端模式

注:本文为博主原创,转载请注明出处! 1、什么是大小端模式? 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地...
  • slience_J
  • slience_J
  • 2016-07-27 19:23:28
  • 4018

共用体(联合体)简介及在大小端判断的巧妙运用

共用体union:几个不同类型的变量共享同一段内存的结构,称为共用体。 共用体的定义、声明均与结构体一样,定义共用体类型一般形式为: union 共用体名 { 成员列表; }变量列表; 例如: uni...
  • u010275850
  • u010275850
  • 2015-10-31 13:17:05
  • 1119

测试机器大小端字节序的小程序

现代机器的字节序组织有两种方式,即大端序组织(big endian)和小端序组织(little endian),典型的Intel 80x86 CPU使用的是little endian,而苹果Macin...
  • erhf
  • erhf
  • 2008-03-18 19:20:00
  • 7165
    个人资料
    持之以恒
    等级:
    访问量: 1786
    积分: 356
    排名: 22万+
    最新评论