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存储在低位。


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

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

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

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

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


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、处理器体系(维基百科)

x86MOS Technology 6502Z80VAXPDP-11等处理器为Little endian。 Motorola 6800Motorola 68000PowerPC 970System/370SPARC(除V9外)等处理器为Big endian ARMPowerPC (除PowerPC 970外), DEC AlphaSPARC V9MIPSPA-RISC and IA64的字节序是可配置的。



转载于:https://my.oschina.net/aram/blog/97233

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值