LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1377|回复: 11

大端、小端的判断问题

[复制链接]
发表于 2004-11-24 15:05:45 | 显示全部楼层 |阅读模式
我记得x86系列的CPU是little endian,但是这个程序

main () {
    unsigned short a;
    a = 5421;  //二进制为0001,0101,0010,1101
    a &= 255;  //0000,0000,1111,1111
    if (a == 45)   //0010,1101
        printf ("big endian\n\n");
    else if (a == 21)   //0001,0101
        printf ("little endian\n\n");
}

每次输出都是
big endian

???
发表于 2004-11-24 15:38:06 | 显示全部楼层
  1. a = 0x5421
复制代码
 楼主| 发表于 2004-11-24 16:19:16 | 显示全部楼层
a = 5421 是什么进制呢?
 楼主| 发表于 2004-11-24 16:21:17 | 显示全部楼层
最初由 herberteuler 发表
  1. a = 0x5421
复制代码


本意就是十进制的五千四百二十一(5421),它的二进制为0001,0101,0010,1101

0x5421的二进制是0101,0100,0010,0001吧
发表于 2004-11-24 16:48:39 | 显示全部楼层

回复: 大端、小端的判断问题

最初由 macarthor 发表
我记得x86系列的CPU是little endian,但是这个程序

main () {
    unsigned short a;
    a = 5421;  //二进制为0001,0101,0010,1101
    a &= 255;  //0000,0000,1111,1111
    if (a == 45)   //0010,1101
        printf ("big endian\n\n");
    else if (a == 21)   //0001,0101
        printf ("little endian\n\n");
}

每次输出都是
big endian

???

不太明白你的意思。inter的cpu 是little endian的,但是对所有的数据是一样的,除非你对内存操作,否则不会出现
                                  0001 ,0101,0010,1101
                                 &1111 ,1111,0000,0000
                                --------------------------
                                  0001, 0101,0000,0000
等于21(二进制0001 0101,按little endian处理)的情况。小弟新手,不知道理解的对不对,请各位指点。给个链接http://www.embed.com.cn/forum/sh ... amp;announceID=6648
发表于 2004-11-24 17:11:18 | 显示全部楼层
是呀,不管little endian还是big endian,取到CPU中进行“位与”运算之前在寄存器中的形态都是一样的,这个程序何以能够判断呢?

改成这样如何?

  1. main () {
  2.         unsigned short a;
  3.         unsigned char b;

  4.         a = 5421;                               //二进制为0001,0101,0010,1101
  5.         b = *(unsigned char *)&a;

  6.         if (b == 45)                            //0010,1101
  7.                 printf ("little endian\n\n");
  8.         else if (b == 21)                       //0001,0101
  9.                 printf ("big endian\n\n");
  10. }
复制代码
发表于 2004-11-24 17:39:17 | 显示全部楼层
[php]
main ()
{
  unsigned short a;
  a = 5421;                     //二进制为0001,0101,0010,1101
  unsigned char *p = (unsigned char*)&a;

  if (*p == 21)                 //0001, 0101
    printf ("big endian\n\n");
  else if (*p == 45)            //1101, 0010
    printf ("little endian\n\n");
}
[/php]
 楼主| 发表于 2004-11-24 21:09:15 | 显示全部楼层
both of them work

but where's the error in my code?
发表于 2004-11-24 21:42:45 | 显示全部楼层
晕,同一机器上,对于a和255,同是大端小端
 楼主| 发表于 2004-11-24 22:12:39 | 显示全部楼层
-.-!!!

那怎么提出a的高低字节呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表