| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2026 人关注过本帖
标题:一个关于大端小端字节序的问题!
只看楼主 加入收藏
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
结帖率:93.75%
收藏
 问题点数:0 回复次数:8 
一个关于大端小端字节序的问题!
谁还有比这更 简单实用明了易懂 的判断字节序的方法,请教请教!
#include <stdio.h>
typedef union//定义共用体
{
    unsigned short int num;
    unsigned char byte[2];
}type_union;

int main(int argc, char *argv)
{
    type_union order;
    order.num = 0xabcd;
    //小端字节序,低地址低字节,高地址高字节
    if (order.byte[0] == 0xcd && order.byte[1] == 0xab)
    {
        printf("Little endian byte order!\n");
    }
    //大端字节序,低地址高字节,高地址低字节
    if (order.byte[0] == 0xab && order.byte[1] == 0xcd)
    {
     printf("Big endian byte order!\n");
    }
    return 0;
}
搜索更多相关主题的帖子: include 
2012-11-11 03:32
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
程序代码:
#include<stdio.h>
int main()
{
    int test = 1;
    if(*(char *)&test)
        printf("Little endian byte order!\n");
    else
        printf("Big endian byte order!\n");
    return 0;
}

重剑无锋,大巧不工
2012-11-11 08:03
Glost
Rank: 2
来 自:湖北
等 级:论坛游民
帖 子:54
专家分:48
注 册:2010-10-5
收藏
得分:0 
回复 2楼 beyondyf
额,好一会才反应过来,看明白!
还记得拿当年的面试题求助,版主的回复让人豁然开朗,曾经一段时间放弃了,
现在捡起来,不知道还能做的好不......感慨啊,以前还不是版主,呵呵

只有一条路不能选择—那就是放弃的路;只有一条路不能拒绝—那就是成长的路。
2012-11-11 08:31
一个孩子
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:356
专家分:954
注 册:2012-10-1
收藏
得分:0 
学习了。

重要的不是结果,是求一个结果的过程,哪怕千难万难,当你有想要的结果时,你已走的很远
2012-11-11 09:58
wangcy155
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2012-10-7
收藏
得分:0 
回复 2楼 beyondyf
不怎么明白
2012-11-11 10:35
wangcy155
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2012-10-7
收藏
得分:0 
以下是引用beyondyf在2012-11-11 08:03:45的发言:

#include
int main()
{
    int test = 1;
    if(*(char *)&test)
        printf("Little endian byte order!\n");
    else
        printf("Big endian byte order!\n");
    return 0;
}
高手就是高手,我明白了一点,是把整型test转换成字符型,截取低八位,如果低八位不为0就是小端为低位,反之则小端是高位,但是(*(char *)&test)还是有点不明白,括号里的结合顺序是什么?
2012-11-11 10:51
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:0 
以下是引用beyondyf在2012-11-11 08:03:45的发言:

#include<stdio.h>
int main()
{
    int test = 1;
    if(*(char *)&test)
        printf("Little endian byte order!\n");
    else
        printf("Big endian byte order!\n");
    return 0;
}

嗯,二楼的测试程序的确简单明了易懂,赞!

解释一下(*(char *)&test):首先看到这句,应该从test开始着手,取整形变量test的地址&test,再将此地址强制类型转换成字符指针类型(char *)&test,那么读取这个地址的时候就只读取一字节的内存块数据,即之前的四字节整型内存块被截断,且这一字节的地址在这四字节中就是最低地址,最后取这一字节内存块的数据*(char *)&test。
如果是Little endian,则保存1的那一位必定在这一字节中而且用%d打印出来的值也是1。
如果是Big endian,则保存1的那一位必定不在这一字节中而且这一字节中的每位都是0,用%d打印出来必定是0

现在有两种方案测试大小端字节序了,第一种楼主我的,第二种二楼的,还有没有其他方案呢?

[ 本帖最后由 小小战士 于 2012-11-11 19:26 编辑 ]

小小战士,战士中的战斗机!
2012-11-11 19:18
hehongwei152
Rank: 2
来 自:珠海
等 级:论坛游民
帖 子:15
专家分:31
注 册:2012-9-28
收藏
得分:0 
回复 2楼 beyondyf
豁然开朗!

return 0;
2012-11-11 19:21
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:0 
来人,跟帖补充

小小战士,战士中的战斗机!
2012-11-22 12:25
快速回复:一个关于大端小端字节序的问题!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.046505 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved