我知道以编程方式测试字符顺序最常见的方法是转换为char*,如下所示:
short temp = 0x1234;
char* tempChar = (char*)&temp;但是否可以像这样通过转换为short*来实现:
unsigned char test[2] = {1,0};
if ( *(short *)test == 1)
//Little-Endian
else
//Big-Endian“测试”缓冲区将(在x86平台上)使用小端约定保存在内存中(从右到左:低位地址为"0“,高位地址为"1”),就像"temp“变量一样,我说的对吗?
更一般的情况是,如果我有一个字符串: char tab[] =“abcdef”,它将如何存储在内存中?会不会颠倒过来:"fedcba"?
谢谢。预付款:-)
PS。
有没有办法查看程序的数据在系统内存中到底是什么样子?我希望在“现实生活”中看到小端的字节交换。
发布于 2012-06-26 05:16:33
您的代码可能会在实践中工作(您可以直接尝试一下!)。然而,从技术上讲,它会调用未定义的行为;该标准不允许您通过另一种类型的指针访问char数组。
如果我有一个字符串: char tab[] =“abcdef”,它将如何存储在内存中?会不会颠倒过来:"fedcba"?
不是的。否则tab[0]会给你f。
发布于 2012-06-26 05:38:01
检查字节序的替代方法将会起作用。
char tab[] = "abcdef"将以相同顺序存储:abcdef
当您访问多个字节(short、int等)时,Endianness就起作用了。当您尝试使用小型endian机器将tab[]作为短数组访问时,您会将其读取为ba,dc,fe (无论它们的实际字节对等值是什么,这就是字符在简写中被“计算”的顺序)。
发布于 2012-06-26 06:10:53
这两种方式都不能保证工作,而且,后者调用未定义的行为。
如果为sizeof(char) == sizeof(short),则First失败。
Second可能会因为同样的原因而失败,而且也是不安全的:指针类型转换的结果可能具有错误的短对齐,并且访问( short )值会调用未定义的行为(3.10.15)。
但是,字符缓冲区是按顺序存储到内存中的,因此&test[0] < &test[1],更广泛地说,正如其他人已经说过的那样,char tab[] = "abcdef"不会被颠倒或以其他方式被置换,而不管字节顺序如何。
https://stackoverflow.com/questions/11197455
复制相似问题