| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2317 人关注过本帖
标题:[讨论]关于大端法与小端法
只看楼主 加入收藏
yangzhifu
Rank: 1
等 级:新手上路
威 望:2
帖 子:433
专家分:0
注 册:2007-4-11
收藏
 问题点数:0 回复次数:11 
[讨论]关于大端法与小端法
能不能用c实现测试是大端还是小端?
无论什么样的机器!
搜索更多相关主题的帖子: 大端 机器 什么样 
2007-10-21 13:18
succubus
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:635
专家分:1080
注 册:2007-10-7
收藏
得分:0 
union
{
unsigned long bits32;
unsigned char bytes[4];
} unValue;

unValue.bytes[0] = 0;
unValue.bytes[1] = 1;
unValue.bytes[2] = 0;
unValue.bytes[3] = 0;

isLittleEndian = ( unValue.bits32 == 256 );

[url=http:///view/aDU1]/image/aDU1.gif" border="0" />[/url]
2007-10-21 13:27
succubus
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:635
专家分:1080
注 册:2007-10-7
收藏
得分:0 

测试变量isLittleEndian就能判断当前机器是大端(假)还是小端了(真)


[url=http:///view/aDU1]/image/aDU1.gif" border="0" />[/url]
2007-10-21 13:29
yangzhifu
Rank: 1
等 级:新手上路
威 望:2
帖 子:433
专家分:0
注 册:2007-4-11
收藏
得分:0 

我还是不懂你的实现方法!
麻烦再细化一点


方寸之内,剖天下; 方坛之内,析自我;
2007-10-21 14:36
succubus
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:635
专家分:1080
注 册:2007-10-7
收藏
得分:0 
是哪里不懂?
请具体提出来我才好解释
因为我个人已经觉得这段代码相当于白话了^_^

[url=http:///view/aDU1]/image/aDU1.gif" border="0" />[/url]
2007-10-21 14:37
yangzhifu
Rank: 1
等 级:新手上路
威 望:2
帖 子:433
专家分:0
注 册:2007-4-11
收藏
得分:0 
isLittleEndian = ( unValue.bits32 == 256 );的作用是?
unValue.bytes[0] = 0;
unValue.bytes[1] = 1;
unValue.bytes[2] = 0;
unValue.bytes[3] = 0;
是付值作用,但它与isLittleEndian = ( unValue.bits32 == 256 );好像没关系!
我第一次接触它

方寸之内,剖天下; 方坛之内,析自我;
2007-10-21 15:22
succubus
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:635
专家分:1080
注 册:2007-10-7
收藏
得分:0 

明白了
看来你是不清楚union的意思
具体关于union的用法说明很多c语言教材上都有
我就简要先说一下
union虽然也可以像struct那样声明多个域
但是与struct不同的是
struct各域的内存空间是独立的
而union各域的内存首地址是相同的
也就是union里的各域共享彼此的内存
因此你改了其中一个域的话也会同时更改其他域的值
具体到这个例子我申明了个union
它有两个域unsigned long bits32和unsigned char bytes[4]
它们都是32位且共用同一段内存
如下图
| bytes[0] | bytes[1] | bytes[2] | bytes[3] |
00000000 00000000 00000000 00000000
|<---------------bits32-------------------->|
当unValue.bytes[0] = 0;
unValue.bytes[1] = 1;
unValue.bytes[2] = 0;
unValue.bytes[3] = 0;
赋值过后这段内存变为
| bytes[0] | bytes[1] | bytes[2] | bytes[3] |
00000000 00000001 00000000 00000000
|<---------------bits32-------------------->|
在小端机器上这段内存作为unsigned int的话值为256,而在大端机器上作为unsigned int的话其值是65536
因此用bits32与256进行比较
如果为真说明是小端机器
如果为假说明是大端机器

[url=http:///view/aDU1]/image/aDU1.gif" border="0" />[/url]
2007-10-21 15:43
succubus
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:635
专家分:1080
注 册:2007-10-7
收藏
得分:0 
不知道现在有没有说清楚

[url=http:///view/aDU1]/image/aDU1.gif" border="0" />[/url]
2007-10-21 15:44
yangzhifu
Rank: 1
等 级:新手上路
威 望:2
帖 子:433
专家分:0
注 册:2007-4-11
收藏
得分:0 






got it !
thank you very much !

方寸之内,剖天下; 方坛之内,析自我;
2007-10-21 17:45
yangzhifu
Rank: 1
等 级:新手上路
威 望:2
帖 子:433
专家分:0
注 册:2007-4-11
收藏
得分:0 

看看我的改进方案:有错误!
#include<stdio.h>
typedef long int elemtype;

typedef union
{
unsigned long bits;
unsigned char bytes[sizeof(elemtype)];
} unValue;

int
main()
{
int k;
int islittlendian;
for(k=0;k<sizeof(elemtype)-1;k++)
{
unValue.bytes[k]=0;
}
unValue.bytes[1]=1;
if(islittlendian=(unValue.bits==256))
{
printf("It is littlendian\n");

return 1;
}
else
return 0;
}


方寸之内,剖天下; 方坛之内,析自我;
2007-10-21 18:22
快速回复:[讨论]关于大端法与小端法
数据加载中...
 
   



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

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