[讨论]关于大端法与小端法
能不能用c实现测试是大端还是小端?无论什么样的机器!
----------------解决方案--------------------------------------------------------
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 );
----------------解决方案--------------------------------------------------------
测试变量isLittleEndian就能判断当前机器是大端(假)还是小端了(真)
----------------解决方案--------------------------------------------------------
我还是不懂你的实现方法!
麻烦再细化一点
----------------解决方案--------------------------------------------------------
是哪里不懂?
请具体提出来我才好解释
因为我个人已经觉得这段代码相当于白话了^_^
----------------解决方案--------------------------------------------------------
isLittleEndian = ( unValue.bits32 == 256 );的作用是?
unValue.bytes[0] = 0;
unValue.bytes[1] = 1;
unValue.bytes[2] = 0;
unValue.bytes[3] = 0;
是付值作用,但它与isLittleEndian = ( unValue.bits32 == 256 );好像没关系!
我第一次接触它
----------------解决方案--------------------------------------------------------
哦
明白了
看来你是不清楚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进行比较
如果为真说明是小端机器
如果为假说明是大端机器
----------------解决方案--------------------------------------------------------
不知道现在有没有说清楚
----------------解决方案--------------------------------------------------------
got it !
thank you very much !
----------------解决方案--------------------------------------------------------
看看我的改进方案:有错误!
#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;
}
----------------解决方案--------------------------------------------------------