c代码测试本机处理器的端序

1、端序简介(维基百科):

端序(Endianness),又称字节序、尾序。在计算机科学领域中,端序是指存放多字节数据的字节(byte)的顺序,典型的情况是整数在内存中的存放方式和网络传输的传输顺序。Endianness有时候也可以用指位序(bit)。

对于单一的字节(a byte),大部分处理器以相同的顺序处理位元(bit),因此单字节的存放方法和传输方式一般相同。

对于多字节数据,如整数(32位机中一般占4字节),在不同的处理器的存放方式主要有两种,以内存中0x0A0B0C0D的存放方式为例,分别有以下几种方式:

1)大端序(英:big-endian)或称大尾序

  • 数据以8bit为单位:
地址增长方向  →
... 0x0A 0x0B 0x0C 0x0D ...

示例中,最高有效位(MSB, Most Significant Byte)是0x0A 存储在最低的内存地址处。下一个字节0x0B存在后面的地址处。正类似于十六进制字节从左到右的阅读顺序。

  • 数据以16bit为单位:
地址增长方向  →
... 0x0A0B 0x0C0D ...

最高的16bit单元0x0A0B存储在低位。

c代码测试本机处理器的端序

2)小端序(英:little-endian)或称小尾序

  • 数据以8bit为单位:
地址增长方向  →
... 0x0D 0x0C 0x0B 0x0A ...

最低有效位(LSB,Least Significant Byte)是0x0D 存储在最低的内存地址处。后面字节依次存在后面的地址处。

  • 数据以16bit为单位:
地址增长方向  →
... 0x0DOC 0x0BOA ...

最低的16bit单元0xOD0C存储在低位。

c代码测试本机处理器的端序

3)混合序(英:middle-endian)具有更复杂的顺序。

PDP-11为例,0x0A0B0C0D被存储为:

  • 32bit在PDP-11的存储方式
地址增长方向  →
... 0x0B 0x0A 0x0D 0x0C ...

可以看作最高的16bit位和低位以大端序存储,但16bit内部以小端存储。


2、代码实现:

测试思想主要是应用c语言的指针,以浮点数125.5为例,浮点数的在内存的存储方式可参看博文:

http://www.cnblogs.com/dolphin0520/archive/2011/10/02/2198280.html

float型数据125.5转换为标准浮点格式:0 10000101 11110110000000000000000

则在内存中存放方式为:

    1)小端

    00000000   低地址

    00000000

     11111011

    01000010   高地址

    2)大端

    00000000   高地址

    00000000

    11111011

    01000010   低地址

代码如下:

#include <stdio.h>
int main(int argc, char *argv[])
{
    float a=125.5;
    char *p=(char *)&a;
    printf("%d ",*p);
    printf("%d ",*(p+1));
    printf("%d ",*(p+2));
    printf("%d\n",*(p+3));
    return 0;
}
如果是小端,则结果: 0 0 -5 66

如果是大端,则结果: 66 -5 0 0

另外,也可以用以下更加简便的代码测试:

int main()
{
    unsigned int a=65;//A的ASCII码为65
    char *p=(char *)a;
    printf("%c",a);
    return 0;
}

如果输出是A,则可判断为小端序。


3、处理器体系(维基百科)

  • x86,MOS Technology 6502,Z80,VAX,PDP-11等处理器为Little endian。
  • Motorola 6800,Motorola 68000,PowerPC 970,System/370,SPARC(除V9外)等处理器为Big endian
  • ARM, PowerPC (除PowerPC 970外), DEC Alpha, SPARC V9, MIPS, PA-RISC and IA64的字节序是可配置的。



你可能感兴趣的:(c,浮点数,endianness)