4th Street Bar Hive-Bar

Hive-Bar Powered by Hive beta-fdb5b5b

Community post

bigendian,littleendian

概述

在计算机内存存储模型中,cpu读取内存分为两种类型,bigendian和littleendian两种,两种的主要区别为,针对同一数据,在内存中的高位存储数据的高位还是低位,例如:
对于十六进制数 0x6162abcd

  • bigendian
    内存低位 0x61 0x62 0xab 0xcd 高位内存

  • littleednian
    内存低位 0xcd 0xab 0x62 0x61 高位内存

通常我们使用的x86系列的cpu计算机使用的little-endian模式

如何判断计算机是big-endian模式还是little-endian模式

   int i =1;
  char *p = (char *)&i;
  if(*p = 1)
      printf("little endian");
  else
     printf("big endian");

要验证大小端,只需要知道计算机在存储数据的时候,低位存储的是低位的数据还是高位的数据,如果是低位的数据,则是little-endian,如果是高位的数据,则是big-endian。i至少占有2个字节的长度,char只有一个字节,当计算机是big-endian时,i的存储方式十六进制为 0x00 0x01,而little-endian则为 0x01 0x00,当把以上的第一个字节赋值给char,也就是p时,如果p=1,那么显然计算机就是little-endian的

其他例子:

/*return 1 则为little-endian ,反之则为其他
int checkCPUendian()
{
  union
{
  unsigned int a;
  unsigned char b;
}c;
c.a = 1;
return(c.b==1);
}

上面利用了联合体的内存共享特性,和第一个例子的原理一样

Linux操作系统内核实现方式:

static union {char c[4]; unsigned long mylong;} endian_test  = {{'l' , '?' , '?' , 'b'}};
#define ENDIANNESS ((char)endian_test.mylong)
0 upvotes $0.00

Replies (1)

Review before signing

Posting as . Signing with . Keychain permission: Posting. Hive Keychain will ask you to approve this action next.


  
Technical details

Operation fingerprint: