标题:[讨论]关于大端法与小端法
只看楼主
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



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-179519-1-1.html




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

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