社区
新手乐园
帖子详情
开序(little endian)—降序(bigendian)
tiankongyouyu
2007-09-03 07:48:12
试编写函数判断计算机的字节存储顺序是开序(little endian)还是降序(bigendian)
不太明白这个题目是什么意思?什么是开序?什么是降序?
是否指这个存储空间的地址按存入数据的次序是递增还是递减的意思?
...全文
821
7
打赏
收藏
开序(little endian)—降序(bigendian)
试编写函数判断计算机的字节存储顺序是开序(little endian)还是降序(bigendian) 不太明白这个题目是什么意思?什么是开序?什么是降序? 是否指这个存储空间的地址按存入数据的次序是递增还是递减的意思?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
小驴
2011-08-30
打赏
举报
回复
学习了.....
yiyun826
2010-03-25
打赏
举报
回复
static int IsBigEndian()
{
short word = 0x4321;
if((*(char *)& word) != 0x21 )
return 1;
else
return 0;
}
clxye
2008-05-08
打赏
举报
回复
顶一下,回答得蛮精辟的,昨天考试就考到这方面了。
iambic
2007-09-03
打赏
举报
回复
google一下比发贴省事多了,看你打这么多字。
iambic
2007-09-03
打赏
举报
回复
/********************************************************************
created: 2006-9-5
filename: test.cpp
author: 李创
purpose: 可移植的用于判断存储格式是
little endian还是big ednian的C代码
取自<<C: A Reference Manual>>
*********************************************************************/
#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;
}
很多人认为掌握这个知识是不必要,其实不然.在网络编程中,TCP/IP统一采用big endian方式传送数据,也就是说,假设现在是在一个字节顺序是little endian的机器上传送数据,要求传送的数据是0XCEFABOBO,那么你就要以0XBOBOFACE的顺序在 unsigned int中存放这个数据,只有这样才能保证存放的顺序满足TCP/IP的字节顺序要求.很多时候,需要自己编写应用层的协议,字节顺序的概念在这个时候就显得及其的重要了.
下面给出的是在big endian和little endian中相互转换的代码,C语言强大的位操作的能力在这里显示了出来:
/********************************************************************
created: 2006-9-5
filename: get32put32.cpp
author: 李创
purpose: 在little endian和big ednian之间相互转化数据的演示代码
*********************************************************************/
#include <stdio.h>
const unsigned char SIZE_OF_UNSIGNEDINT = sizeof(unsigned int);
const unsigned char SIZE_OF_UNSIGNEDCHAR = sizeof(unsigned char);
void put_32(unsigned char *cmd, unsigned int data)
{
int i;
for (i = SIZE_OF_UNSIGNEDINT - 1; i >= 0; --i)
{
cmd = data % 256;
// 或者可以:
//cmd = data & 0xFF;
data = data >> 8;
}
}
unsigned int get_32(unsigned char *cmd)
{
unsigned int ret;
int i;
for (ret = 0, i = SIZE_OF_UNSIGNEDINT - 1; i >= 0; --i)
{
ret = ret << 8;
ret |= cmd;
}
return ret;
}
int main(void)
{
unsigned char cmd[SIZE_OF_UNSIGNEDINT];
unsigned int data, ret;
unsigned char *p;
int i;
data = 0x12345678;
printf("data = %x\n", data);
// 以字节为单位打印出数据
p = (unsigned char*)(&data);
for (i = 0; i < SIZE_OF_UNSIGNEDINT; ++i)
{
printf("%x", *p++);
}
printf("\n");
// 以相反的顺序存放到cmd之中
put_32(cmd, data);
for (i = 0; i < SIZE_OF_UNSIGNEDINT; ++i)
{
printf("cmd[%d] = %x\n", i, cmd);
}
// 再以相反的顺序保存数据到ret中
// 保存之后的ret数值应该与data相同
ret = get_32(cmd);
printf("ret = %x\n", ret);
p = (unsigned char*)(&ret);
for (i = 0; i < SIZE_OF_UNSIGNEDINT; ++i)
{
printf("%x", *p++);
}
printf("\n");
return 0;
}
iambic
2007-09-03
打赏
举报
回复
little endian和big endian是表示计算机字节顺序的两种格式,所谓的字节顺序指的是长度跨越多个字节的数据的存放形式.
假设从地址0x00000000开始的一个字中保存有数据0x1234abcd,那么在两种不同的内存顺序的机器上从字节的角度去看的话分别表示为:
1)little endian:在内存中的存放顺序是0x00000000-0xcd,0x00000001-0xab,0x00000002-0x34,0x00000003-0x12
2)big endian:在内存中的存放顺序是0x00000000-0x12,0x00000001-0x34,0x00000002-0xab,0x00000003-0xcd
需要特别说明的是,以上假设机器是每个内存单元以8位即一个字节为单位的.
简单的说,ittle endian把低字节存放在内存的低位;而big endian将低字节存放在内存的高位.
现在主流的CPU,intel系列的是采用的little endian的格式存放数据,而motorola系列的CPU采用的是big endian.
以下是判断字节存储顺序的可移植的C语言代码:
tiankongyouyu
2007-09-03
打赏
举报
回复
顺便,最好有哪位高人帮忙写段代码参考学习下,谢谢
c++ 面试题 总结
C++面试题 1.是不是一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态? virtual修饰符会被隐形继承的。 private 也被集成,只事派生类没有访问权限而已 virtual可加可不加 子类的空间里有父类的所有变量(static除外) 同一个函数只存在一个实体(in
li
ne除外) 子类覆盖它的函数不加virtual ,也能实现多态。 在子类的空间里,有父类的私有变量。私有变量不能直接访问。 -------------------------------------------------------------------------- 2.输入一个字符串,将其逆序后输出。(使用C++,不建议用伪码) #include using namespace std; void main() { char a[50];memset(a,0,sizeof(a)); int i=0,j; char t; cin.get
li
ne(a,50,'\n'); for(i=0,j=strlen(a)-1;i
str; str.replace; cout
a = a/9; =>a = 1; -------------------------------------------------------------------------- 5. const 符号常量; (1)const char *p (2)char const *p (3)char * const p 说明上面三
判断机器字节存储顺序是big
endian
还是
li
ttle
endian
union { unsigned int i; unsigned char c;}u;bool is
Li
ttle
Endian
(){ u.i = 0x01; return u.c == 1;}
试编写函数判断计算机的字节存储顺序是
开序
(
li
ttle
endian
)还是
降序
(
big
endian
)
li
ttle
endian
和big
endian
是表示计算机字节顺序的两种格式,所谓的字节顺序指的是长度跨越多个字节的数据的存放形式. 假设从地址0x00000000开始的一个字中保存有数据0x1234abcd,那么在两种不同的内存顺序的机器上从字节的角度去看的话分别表示为: 1)
li
ttle
endian
:在内存中的存放顺序
判断计算机的字节存储顺序--big
endian
or
li
ttle
endian
?
short usData = 0x1122; char *pucData = (char*)&usData; bool b
Big
Endian
= (*pucData == 0x22); 转载于:https://www.cnblogs.com/taoxu0903/archive/2008/07/01/1233335.html
判断字节的升序存储还是
降序
存储(
li
ttle
-
endian
or big-
endian
)
int
Endian
ee(void){ union{ int the_integer; char the_single_byte; }
ENDIAN
;
ENDIAN
endian
;
endian
.the_integer = 1; return
endian
.the_single_byte;}
新手乐园
33,311
社区成员
41,784
社区内容
发帖
与我相关
我的任务
新手乐园
C/C++ 新手乐园
复制链接
扫一扫
分享
社区描述
C/C++ 新手乐园
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章