• 6399阅读
  • 0回复

big-endian和little-endian [复制链接]

上一主题 下一主题
离线herrybolly
 

只看楼主 倒序阅读 楼主  发表于: 2006-11-27
1.对不同类型的计算机而言,它们在一个字中使用的字节顺序约定会有所不同。有些计算机约定将最有意义的字节放在一个字的前面(称为big-endian顺序),而另一些计算机则约定将最有意义的字节放在后面(称为little-endian顺序)。这里“最有意义的字节”相对计算机所表示的一个数而言,指的是存放一个数最有意义位的字节。例如,对于整数而言,最有意义的位是最高位;对于浮点数而言,是存放阶码最高位的字节。
2.在采用big-endian顺序的计算机中,一个字的字节顺序由低地址至高地址编号,字节顺序与地址顺序是一致的。而在采用little-endian顺序的系统中,一个字的字节顺序由高地址至低地址编号,字节顺序与地址顺序相反。如下所示:
字节编号   0     1     2     3
big-endian   1     2     3     4     数字0x1234
        地址A 地址A+1 地址A+2 地址A+3
字节编号   3     2     1     0
little-endian   4     3     2     1     数字0x1234
地址A 地址A+1 地址A+2 地址A+3
3.测试系统为big-endian还是little-endian的代码:
#include <sys/utsname.h>
#include <unistd.h>
#include <stdio.h>
int main(void)
{
  union {
    short inum;
    char c[sizeof(short)];
  }un;
  struct utsname uts;
  un.inum = 0x0102;
  /* 打印出CPU名,操作系统及其版本号 */
  if(uname(&uts) < 0)
    printf("Could not get host information\n");
  printf("%s--%s--%s:", uts.machine, uts.sysname, uts.release);
  /* 检测字节顺序 */
  if(sizeof(short) != 2){
    printf("sizeof short = %d\n", sizeof(short));
    //exit(0);
  }
  if(un.c[0] == 1 && un.c[1] == 2)
    printf("big_endian\n");
  else if(un.c[0] == 2 && un.c[1] == 1)
    printf("little_endian\n");
  else
    printf("unknown\n");
  //exit(0);
//armv4l--Linux--2.4.18-rmk7-pxa1:little_endian
//i686--Linux--2.6.11-1.1369_FC4:little_endian
}
[ 此贴被XChinux在2006-12-24 10:49重新编辑 ]
快速回复
限100 字节
 
上一个 下一个