首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >以编程方式检查字节顺序

以编程方式检查字节顺序
EN

Stack Overflow用户
提问于 2012-06-26 05:14:23
回答 4查看 601关注 0票数 0

我知道以编程方式测试字符顺序最常见的方法是转换为char*,如下所示:

代码语言:javascript
运行
复制
short temp = 0x1234;
char* tempChar = (char*)&temp;

但是否可以像这样通过转换为short*来实现:

代码语言:javascript
运行
复制
unsigned char test[2] = {1,0};  
if ( *(short *)test == 1)
    //Little-Endian
else
    //Big-Endian

“测试”缓冲区将(在x86平台上)使用小端约定保存在内存中(从右到左:低位地址为"0“,高位地址为"1”),就像"temp“变量一样,我说的对吗?

更一般的情况是,如果我有一个字符串: char tab[] =“abcdef”,它将如何存储在内存中?会不会颠倒过来:"fedcba"?

谢谢。预付款:-)

PS。

有没有办法查看程序的数据在系统内存中到底是什么样子?我希望在“现实生活”中看到小端的字节交换。

EN

回答 4

Stack Overflow用户

发布于 2012-06-26 05:16:33

您的代码可能会在实践中工作(您可以直接尝试一下!)。然而,从技术上讲,它会调用未定义的行为;该标准不允许您通过另一种类型的指针访问char数组。

如果我有一个字符串: char tab[] =“abcdef”,它将如何存储在内存中?会不会颠倒过来:"fedcba"?

不是的。否则tab[0]会给你f

票数 2
EN

Stack Overflow用户

发布于 2012-06-26 05:38:01

检查字节序的替代方法将会起作用。

char tab[] = "abcdef"将以相同顺序存储:abcdef

当您访问多个字节(short、int等)时,Endianness就起作用了。当您尝试使用小型endian机器将tab[]作为短数组访问时,您会将其读取为ba,dc,fe (无论它们的实际字节对等值是什么,这就是字符在简写中被“计算”的顺序)。

票数 0
EN

Stack Overflow用户

发布于 2012-06-26 06:10:53

这两种方式都不能保证工作,而且,后者调用未定义的行为。

如果为sizeof(char) == sizeof(short),则First失败。

Second可能会因为同样的原因而失败,而且也是不安全的:指针类型转换的结果可能具有错误的短对齐,并且访问( short )值会调用未定义的行为(3.10.15)。

但是,字符缓冲区是按顺序存储到内存中的,因此&test[0] < &test[1],更广泛地说,正如其他人已经说过的那样,char tab[] = "abcdef"不会被颠倒或以其他方式被置换,而不管字节顺序如何。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11197455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档