免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5650 | 回复: 9
打印 上一主题 下一主题

大小端判断的小程序问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-29 15:40 |只看该作者 |倒序浏览
#include <stdio.h>

int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;int n = 0X1234;
&nbsp;&nbsp;&nbsp;&nbsp;char *p = (char *)&n;
&nbsp;&nbsp;&nbsp;&nbsp;printf("%x\n", *p);

&nbsp;&nbsp;&nbsp;&nbsp;if(*p == 0X1)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Big Endian\n");
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;else if(*p == 0X4)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Little Endian\n");
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("impossible\n");
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

输出是
0
impossible
在sparc下应该是Big Endian呀

论坛徽章:
0
2 [报告]
发表于 2008-08-29 15:46 |只看该作者
呵呵,注意sizeof(int)=4
0x1234仅仅是2个字节

论坛徽章:
0
3 [报告]
发表于 2008-08-29 15:47 |只看该作者
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
        unsigned short v = 0x0102;
        unsigned char *p = (unsigned char *)&v;

        if (*p == 0x01)
                printf("big\n");
        else if (*p == 0x02)
                printf("small\n");

        return 0;
}

论坛徽章:
0
4 [报告]
发表于 2008-08-29 15:50 |只看该作者

回复 #2 gawk 的帖子

0X是4位没注意
改成
#include <stdio.h>

int main()
{
    int n = 0X11223344;
    char *p = (char *)&n;

    if(*p == 0X11)
    {
        printf("Big Endian\n");
    }
    else if(*p == 0X44)
    {
        printf("Little Endian\n");
    }
    else
    {
        printf("Impossible\n");
    }

    return 0;
}
就可以了

论坛徽章:
0
5 [报告]
发表于 2008-08-29 16:14 |只看该作者
原帖由 zhongyj 于 2008-8-29 15:40 发表
#include

int main()
{
    int n = 0X1234;
    char *p = (char *)&n;
    printf("%x\n", *p);

    if(*p == ...


如果sparc是大端,程序的输出就是正确的

论坛徽章:
0
6 [报告]
发表于 2008-08-29 16:30 |只看该作者

一个宏就搞定

#define IsLittleEndian static_cast<bool>(static_cast<unsigned char>(0x0001))

论坛徽章:
0
7 [报告]
发表于 2008-08-29 16:41 |只看该作者
给楼主提供一段程序
  1. int checkCPU()
  2. {
  3.     union w
  4.    {
  5.        int a;  
  6.        char b;
  7.    } c;
  8.     c.a = 1;
  9.     return (c.b == 1);
  10. }
复制代码

联合体union的存放顺序是所有成员都从低地址开始存放,若处理器是Big_endian(从高字节到低字节存放数据)的,则返回0;若是Little_endian(从低字节到高字节存放数据)的,则返回1

论坛徽章:
0
8 [报告]
发表于 2008-08-29 16:43 |只看该作者
比较粗糙的实现:

  1. int isLittleEndian()
  2. {
  3.     int i = 1;
  4.     char*p = (char*)(&i);
  5.     return (*p);
  6. }
复制代码

论坛徽章:
0
9 [报告]
发表于 2008-08-29 17:16 |只看该作者
楼上几位都对。
你要弄清楚sizeof(int)==4&&sizeof(char)==1
&&一个hex实际上是4个bit
一个char要占用8个bit,即两个hex
你的int n=0x1234;实际上应该是int n=0x00001234
因此程序应该改为:

  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int n = 0X1234;
  5.     char *p = (char *)&n;
  6.     printf("%x\n", *p);

  7.     if(*p == 0x00)
  8.     {
  9.         printf("Big Endian\n");
  10.     }
  11.     else if(*p == 0X34)
  12.     {
  13.         printf("Little Endian\n");
  14.     }
  15.     else
  16.     {
  17.         printf("impossible\n");
  18.     }

  19.     return 0;
  20. }

复制代码

论坛徽章:
0
10 [报告]
发表于 2008-08-29 17:25 |只看该作者
用7楼的联合体的方法吧

[ 本帖最后由 zszjxh 于 2008-8-29 17:29 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP