怎样确定平台大小端问题

杨六 2011-10-18 04:39:05
一直以为自己了解大小端问题就行了,但有一天师傅突然问我,怎样确定大小端。
霹雳啪啦我就说了一堆,也举了个大家常见的联合体的方法来确认平台的大小端。
但师傅说貌似平时并不会写这个程序来判断系统的大小端,而应该是其他的方法,看来看去真不知道是什么方法,特来求解。
被师傅说知其然不知其所以然,哎,以前不会考虑这么复杂的问题,看来得重新审视下自已了。
...全文
327 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
杨六 2011-10-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 agoago_2009 的回复:]
C/C++ code

LONG a=0X12345678;
cout<<a<<endl;
LONG b=htonl(a);
cout<<b<<endl;
cout<<"如果a和b输出一致,则是:大端,否则是小端"<<endl;
[/Quote]
谢谢大家,大家说的联合体和指针的方法不是师傅想要的,但感觉这个答案应该不错,既考查大小端问题,同时对网络序的理解更深刻。
Itusee能看社区 2011-10-19
  • 打赏
  • 举报
回复
问厂家
「已注销」 2011-10-19
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 pathuang68 的回复:]

C/C++ code

union {
int a;
char b[sizeof(int)];
}test;

test.b[0]=1;
test.b[1]=2;
test.b[2]=3;
test.b[3]=4;



对于大端的,这个a就是0x04030201,对于小端,则应该是0x01020304,判断a就知道是大端小端了
[/Quote]

猴吃麻花——满拧。
赵4老师 2011-10-19
  • 打赏
  • 举报
回复
通常
CPU厂商:Intel、AMD小端
CPU厂商:Moto、ARM大端
pathuang68 2011-10-18
  • 打赏
  • 举报
回复

union {
int a;
char b[sizeof(int)];
}test;

test.b[0]=1;
test.b[1]=2;
test.b[2]=3;
test.b[3]=4;


对于大端的,这个a就是0x04030201,对于小端,则应该是0x01020304,判断a就知道是大端小端了
孤独小剑 2011-10-18
  • 打赏
  • 举报
回复
好像在哪里看到过说现在很多机器默认都是小端的,但同样现在很多机器的CPU是支持手动调的,至于如何调就不知道了,楼主可以参考这个方向找找资料。
pathuang68 2011-10-18
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;

bool checkSystem()
{
union check
{
int i;
char ch;
}
c;
c.i =1;

return(c.ch == 1);
}

int amen(void)
{
if(checkSystem()) cout << "Little Endian" << endl;
else cout << "Big Endian" << endl;
return 0;
}
goldbeef 2011-10-18
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
int i = 0x12345678;
char *p = (char*)&i;
if (*p==0x78)
{
cout<<"little end"<<endl;
}
else
{
cout<<"big end"<<endl;
}
return 0;
}
goldbeef 2011-10-18
  • 打赏
  • 举报
回复
#include <stdio.h>
int main()
{
int i = 0x12345678;
char *p = (char*)&i;
printf ("the first %x\n", *p);
printf ("the second %x\n", *(p+1));
printf ("the third %x\n", *(p+2));
printf ("the fourth %x\n", *(p+3));
return 0;
}

如果输出
78
56
34
12
则是小段


如果输出
12
34
56
78
则是大端
AnYidan 2011-10-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zhao4zhong1 的回复:]
C/C++ code
short int s=0x1234;
if (0x34==*((char *)&s)) printf("Little Endian\n");
else printf("Big Endian\n");


VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄……
[/Quote]

++
szqh97 2011-10-18
  • 打赏
  • 举报
回复
#include <stdio.h>
int main()
{
int i = 0x1234;
char *p = (char*)&i;
printf ("the first %x\n", *p);
printf ("the first %x\n", *(p+1));
return 0;
}


Little Endian
zhujian888 2011-10-18
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
int main(X)
{ exit(0 > puts((*(char *)&X == (char)X)?"Little endian":"Big endian")); }
自信男孩 2011-10-18
  • 打赏
  • 举报
回复
楼上的各位说的都很好。
系统的大小端问题,就是采用大小模式对数据进行存放的区别。大端方式是将高字节放在低地址,将低字节放在高地址,即高对低,低对高;小端方式就是将高字节放在高地址,将低字节放在高地址,即低对低,高对高。采用大端方式存放数据符合人类的正常思维,采用小端方式存放利于计算机处理。
nightkids_008 2011-10-18
  • 打赏
  • 举报
回复
他问的是不写代码确定大小端。。。。。。就一个答案 问产家。。。
赵4老师 2011-10-18
  • 打赏
  • 举报
回复
short int s=0x1234;
if (0x34==*((char *)&s)) printf("Little Endian\n");
else printf("Big Endian\n");

VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

ouen333 2011-10-18
  • 打赏
  • 举报
回复
看下大小端格式概念,人们常说的 主机字节序 网络字节序 一次性搞定吧。自己动手试试
测试代码如下:
int a =0x04030201;
int *p = &a;
for(int i = 0;i<4;i++)
printf("%02x\n",*((char *)p+i));
system("pause");
return 0;
luciferisnotsatan 2011-10-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ezword 的回复:]

至少有两种方式,
1,用指针加上强制作转换;
2,用联合体;
具体你可以搜下。
[/Quote]
++
Gloveing 2011-10-18
  • 打赏
  • 举报
回复
LONG a=0X12345678;
cout<<a<<endl;
LONG b=htonl(a);
cout<<b<<endl;
cout<<"如果a和b输出一致,则是:大端,否则是小端"<<endl;
ezword 2011-10-18
  • 打赏
  • 举报
回复
至少有两种方式,
1,用指针加上强制作转换;
2,用联合体;
具体你可以搜下。

69,373

社区成员

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

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