我这个判断大小端的代码对吗?

rickys2080 2012-09-03 08:47:53

/*
** 测试计算机大小端的程序
** syrchina 2012-8-14
*/

#include <stdio.h>

static union { char c[4]; unsigned long l; } endian_test = { { 'L', '?', '?', 'B' } };
#define ENDIANNESS ((char)endian_test.l) // Linux方法

const static short _endianness = 0x424C;
#define MY_ENDIANNESS ((char)_endianness) // 我的方法:值为B(0x42)表示大端,值为L(0x4C)表示小端
//小端机器上判断正确,但我不知道大端机器上是否正确,因为我不知道大端机器变量地址是指向了高字节还是低字节;
//小端机器的变量地址是指向低字节的;比如int x,那么&x是4个字节中低字节的地址。
//大端机器是怎样的呢?

int main(int argc, char *argv[])
{
//short int x = 0x0201;
//printf("%x\n", (char)x);//输出2表示大端,输出1表示小端

printf("%c\n", ENDIANNESS);
printf("%c\n", MY_ENDIANNESS);

return 0;
}
...全文
380 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
rickys2080 2012-09-04
  • 打赏
  • 举报
回复
低级错误啊,当时忽略了C语言的语法。。。
rickys2080 2012-09-04
  • 打赏
  • 举报
回复
结论:

本楼主的程序是错误的,因为它在任何情况下返回结果都是低字节数据:
const static short _endianness = 0x424C;
#define MY_ENDIANNESS ((char)_endianness) // 我的方法:值为B(0x42)表示大端,值为L(0x4C)表示小端

改为这样才是正确的:
const static short _endianness = 0x424C;
#define MY_ENDIANNESS (*(char*)&_endianness) // 我的方法:值为B(0x42)表示大端,值为L(0x4C)表示小端

我之前只在PC上运行了,以为是正确的,但一直不太放心;今天安装了个keil C51仿真了一下,发现了问题,做出上述修正。
原因简述:
虽然无论在大端还是小端模式下,对于int x; 这样的变量定义,&x 的值都是低字节的地址,但是在进行(char)x 这样的强制类型转换时,编译器会自动处理,使之结果为低字节(而不一定是低地址)的数据,因为这样才符合C语言的语法。
AnYidan 2012-09-03
  • 打赏
  • 举报
回复
无论小端机器还是大端机器,指针均指向一个变量地址的起始处,即地址值最小的空间;
AnYidan 2012-09-03
  • 打赏
  • 举报
回复
无论小端机器还是大端机器,指针均指向一个变量地址的起始处,即地址值最小的空间;
shen_wei 2012-09-03
  • 打赏
  • 举报
回复
shen_wei 2012-09-03
  • 打赏
  • 举报
回复
图灵狗 2012-09-03
  • 打赏
  • 举报
回复
我曾经遇到过一个编译器把用short类型来表达char类型。
didijiji 2012-09-03
  • 打赏
  • 举报
回复

int checkCPU( )
{
{
union w
{
int a;
char b;
} c;
c.a = 1;
return(c.b ==1);
}
}
didijiji 2012-09-03
  • 打赏
  • 举报
回复

int checkCPU( )
{
{
union w
{
int a;
char b;
} c;
c.a = 1;
return(c.b ==1);
}
}
rickys2080 2012-09-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

理论上是OK的,不过用short可能会有缺陷,最好用超过int的类型,这样编译器不会做什么特别的事情。
[/Quote]
"特别的事情"是指啥?
图灵狗 2012-09-03
  • 打赏
  • 举报
回复
理论上是OK的,不过用short可能会有缺陷,最好用超过int的类型,这样编译器不会做什么特别的事情。
rickys2080 2012-09-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

无论小端机器还是大端机器,指针均指向一个变量地址的起始处,即地址值最小的空间;
[/Quote]

唉呀妈呀,终于等到专家真言了!要的就是这个确定的结论。

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧