big endian 和 little endian 问题

子庚 2010-11-10 10:07:45
#include <stdio.h>

union
{
long Long;
char Char[sizeof(long)];
}u;

int main()
{
u.Long = 1;
if(u.Char[0] == 1)
{
printf("Little Endian!\n");
}
else if (u.Char[sizeof(long) - 1] == 1)
{
printf("Big Endian!\n");
}
else
{
printf("Unknown Addressing!\n");
}

printf("Now, Let's look at every byte in the memory!\n");
for (int i = 0; i < sizeof(long); ++i)
{
printf("[%x] = %x\n", &u.Char, u.Char);
}

return 0;
}


请详细解释数据在计算机内保存的时地址的分配方式,从高地址到低地址,这到是什么意思,请写一个例子,
还有为什么这个程序能判断我的机器是big endian 和 little endian
...全文
151 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
车太靓 2010-11-10
  • 打赏
  • 举报
回复
楼主理解正确!
至善者善之敌 2010-11-10
  • 打赏
  • 举报
回复
大端格式:

在这种格式中,字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中,如图2.1所示:




小端格式:

与大端存储格式相反,在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。如图2.2所示:




请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1

解答:

int checkCPU( )

{

{

union w

{

int a;

char b;

} c;

c.a = 1;

return(c.b ==1);

}

}

我们的机器一般都是小端格式!
begges 2010-11-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 getline 的回复:]
C/C++ code
#include <iostream>
using namespace std;

union Test
{
char c;
int i;
};

int main()
{
Test ts;
ts.i = 1;
cout << (int)ts.c << endl;
return 0;
}
[/Quote]
1是个位数,小端机器存在低位地址上,输出为1。 大端机器存在高位地址上,输出0。
luciferisnotsatan 2010-11-10
  • 打赏
  • 举报
回复
0x1234abcd
big 为 12 34 ab cd
little 为 cd ab 34 12

你给个
int a = 1
然后 char *p = (char*)&a;
判断下*p为1还是0就知道了
qq120848369 2010-11-10
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

int main()
{
union
{
int a;
char b;
} test;

test.a=0x10011001; //10 01 10 01 ,二进制串,右边是最低位
char *p=&test.b;

for(int i=0;i<4;++i)
{
cout<<(int)p[i]<<" "<<endl;
//咱的电脑肯定打印 1 16 1 16,意思就是二进制串的低位从内存的低位开始放,这叫小端
//有的高级电脑打印 16 1 16 1, 意思是二进制串的高位从内存的低位开始放,这叫大端
}

return 0;
}
子庚 2010-11-10
  • 打赏
  • 举报
回复
假如long占用4个字节
那么在联合中long的地址为

ox00000000 第一个字节

ox00000001 第二个字节

0x00000002 第三个字节

ox00000003 第四个字节

在联合中 char 数组的位置为

ox00000000 第一个字节 a[0]

ox00000001 第二个字节 a[1]

0x00000002 第三个字节 a[2]

ox00000003 第四个字节 a[3]
按照小数端的要求,低位保存在低地址处, 如果a[0] == 1,可见就是小数端.
大数端的要求,低位保存在高地址处,a[3] = 1那就是大数端..
我理解的正确吗??


昵称很不好取 2010-11-10
  • 打赏
  • 举报
回复
就是多字节的数在计算机的存储形式,是高字节存在高地址还是低字节存在高地址,一般intel和AMD好像都是小端,程序最后的printf语句没有把i给传进去
healer_kx 2010-11-10
  • 打赏
  • 举报
回复
比如说一个数字 1,它的二进制形式是 0000000000000000000000000000001

16进制的形式是 00 00 00 01那么问题是,里面那个1 放在高位,还是地位,这是一个问题。
不是所有的系统都是放到低位的。那么就需要你自己去判断了,不过一般都是 高位存在高地址的。
getline 2010-11-10
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

union Test
{
char c;
int i;
};

int main()
{
Test ts;
ts.i = 1;
cout << (int)ts.c << endl;
return 0;
}

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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