判断机器大小端模式的方法

首先我们要明白啥子叫大端模式、小端模式。

大端模式,是指数据的高位,保存在内存的低地址中,而数据的低位,保存在内存的高地址中;

小端模式,是指数据的高位,保存在内存的高地址中,而数据的低位,保存在内存的低地址中;

大端模式和我们的逻辑有点相反,而小端模式和我们的逻辑是一致的;

对于32位的系统,他一个字长是4个字节。那么对于数据0x12345678

你可以在linux的目录下建立一个文件,将数据0x12345678输入进去,保存文件。

利用命令 od -x  filename  查看

测试结果是:00000000  7830  3231  3433  3635  3837  000a

      00000013

利用命令 hexdump -C filename  查看

测试结果是:00000000  30  78  31  32  33  34  35
 36  37  38  0a

          0000000b

利用C语言测试

1.通过读取同一地址的整型数据和字符数据来区分大端还是小端

#incude <stdio.h>

typedef unsigned int Type;

int main()

{

  Type data, *point;

  point = &data;

  *(Type *)point = 0x12;

  if(0x12 == data)

  {

    printf("Little-endian\n");

  }

  else if(0x00000012 == data)

  {

    printf("Big-endian\n");

  }

  else

  {

    printf("Unable to determine\n");

  }

  return 0;

}

2. 通过联合体union共享内存的特性,来判断是大端模式还是小端模式

#include <stdio.h>

typedef union

{

  char ch;

  int    data;

}Udata;

int main()

{

  Udata tmpData;

  tmpData.data = 0x12345678;

  if(tmpData.ch == 0x78)

  {

    printf("Little-endian\n");

  }

  else if(tmpData.ch == 0x12)

  {

    printf("Big-endian\n");

  }

  else

  {

    printf("Unable to determine\n");

  }

  return 0;

}

3.linux的开发者,在内核中可以这样来测试机器的类型

static union { char c[4]; unsigned long mylong; } endian_test =
{{‘l‘,‘?‘,‘?‘,‘b‘}};

#define ENDIANNESS ((char)endian_test.mylong)

cout<<ENDIANNESS<<endl;

时间: 2024-07-30 09:58:11

判断机器大小端模式的方法的相关文章

经典笔试题:用C写一个函数测试当前机器大小端模式

“用C语言写一个函数测试当前机器的大小端模式”是一个经典的笔试题,如下使用两种方式进行解答: 1. 用union来测试机器的大小端 1 #include <stdio.h> 2 3 union test 4 { 5 int a; 6 char b; 7 }; 8 9 int endian_test(void) 10 { 11 union test t1; 12 t1.a = 1; 13 return t1.b; 14 } 15 16 int main(void) 17 { 18 int i =

判断机器的大小端模式

大小端模式: 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放:这和我们的阅读习惯一致. 小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低. 下面以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况,我们

(转)大小端模式详解

int i=1; char *p=(char *)&i; if(*p==1) printf("1"); else printf("2"); 大小端存储问题,如果小端方式中(i占至少两个字节的长度)则i所分配的内存最小地址那个字节中就存着1,其他字节是0.大端的话则1在i的最高地址字节处存放,char是一个字节,所以强制将char型量p指向i则p指向的一定是i的最低地址,那么就可以判断p中的值是不是1来确定是不是小端. 请写一个C函数,若处理器是Big_end

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

1.什么是大小端模式? 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放:这和我们的阅读习惯一致. 小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低. 2.知道大小端有何用? 首先要介绍一下字节序列,所谓的字节序列就是大于或者等于两个字节类型的数据存放在

大小端模式详解

http://www.cnblogs.com/xinsheng/archive/2012/04/18/2455039.html 端模式(Endian)的这个词出自Jonathan Swift书写的<格列佛游记>.这本书根据将鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归为Big Endian,从尖头开始将鸡蛋敲开的人被归为Littile Endian(这句话最为形象).小 人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian

C/C++ 关于大小端模式

大端模式:  数据的高字节存在低地址  数据的低字节存在高地址 小端模式:  数据的高字节存在高地址  数据的低字节存在低地址 如图,i为int类型占4个字节,但只有1个字节的值为1,另外3个字节值为0:取出低地址上的值,当其为1时则为小端模式,为0时为大端模式. //大小端模式的判断 //方法一:利用联合体所有成员的起始位置一致, //对联合体中的int类型赋值,然后判断联合体中char类型的值的大小 void SysCheck() { union IsLitte_Endian { int i

大小端模式和位域详解(转载)

端模式(Endian)的这个词出自Jonathan Swift书写的<格列佛游记>.这本书根据将鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归为Big Endian,从尖头开始将鸡蛋敲开的人被归为Littile Endian(这句话最为形象).小 人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开.在计算机业Big Endian和Little Endian也几乎引起一场战争.在计算机业界,Endian表示数据在存储器

大小端模式与网络字节序

一.为什么会出现大小端模式? 不同的cpu采用的大小端模式不一致.X86是小端模式.而KEIL C51则为大端模式.很多的ARM,DSP都为小端模式.有些ARM处理器还可以由硬件来选择是大端模式还是小端模式. 二.大小端模式的不同带来的问题是什么?如何解决? 如果存在数据网络传输,如果大小端模式不一致,如果不经过转换,必然会导致数据不致,出现错误. 解决方法:统一将网络上传输的字节序采用同一种模式(大家都知道的),这样收发数据时,就会根据主机对应的模式是否和网络字节对应的模式一致,来判断是否需要

CPU大小端模式及转换

通信协议中的数据传输.数组的存储方式.数据的强制转换等这些都会牵涉到大小端问题. CPU的大端和小端模式很多地方都会用到,但还是有许多朋友不知道,今天暂且普及一下. 一.为什么会有大小端模式之分呢? 因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit. 但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的int型.另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何