0

我知道以编程方式测试字节顺序的最常用方法是像这样转换为 char*:

short temp = 0x1234;
char* tempChar = (char*)&temp;

但是可以通过转换为 short* 来完成,如下所示:

unsigned char test[2] = {1,0};  
if ( *(short *)test == 1)
    //Little-Endian
else
    //Big-Endian

我是否正确,“测试”缓冲区将使用 Little-Endian 约定(从右到左:“0”在较低地址,“1”在较高地址)保存在内存中(在 x86 平台上),就像以防万一与“温度”变量?

更一般地说,如果我有一个字符串: char tab[] = "abcdef"; 它将如何存储在内存中?它会像“fedcba”一样反转吗?

谢谢。提前:-)

PS。

有什么方法可以查看程序的数据在系统内存中的样子?我想在“现实生活”中看到 Little-Endian 中的字节交换。

4

4 回答 4

2

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

更一般地说,如果我有一个字符串: char tab[] = "abcdef"; 它将如何存储在内存中?它会像“fedcba”一样反转吗?

不,否则tab[0]会给你f

于 2012-06-25T21:16:32.613 回答
0

使用联合会更安全,即符合标准。

于 2012-06-25T22:58:04.007 回答
0

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

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

当您访问多个字节(short、int 等)时,字节序就会发挥作用。当您尝试tab[]使用小型字节序机器作为短数组访问时,您会将其读取为 ba、dc、fe(无论它们的实际字节等价物是什么,这都是字符在 short 中“评估”的顺序)。

于 2012-06-25T21:38:00.753 回答
0

不保证这两种方式都有效,此外,后者会调用未定义的行为。

如果 . 首先失败sizeof(char) == sizeof(short)

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

但是,是的,字符缓冲区按顺序存储到内存中,因此&test[0] < &test[1],更一般地说,正如其他人已经说过的那样,char tab[] = "abcdef"无论字节顺序如何,都不会反转或以其他方式排列。

于 2012-06-25T22:10:52.890 回答