测试Endianness:为什么以下代码有效?

Ock*_*zor 14 c c++ type-conversion endianness

虽然我确实理解字节顺序,但我稍微不清楚代码如何在下面工作.我想这个问题不是关于字节序的问题,更多的是关于char*指针和int如何工作,即类型转换.此外,如果变量word不是一个short但只是一个变量,它会有什么不同int吗?谢谢!

#define BIG_ENDIAN 0
#define LITTLE_ENDIAN 1

int byteOrder() {
    short int word = 0x0001;
    char * byte = (char *) &word;
    return (byte[0] ? LITTLE_ENDIAN : BIG_ENDIAN);
}
Run Code Online (Sandbox Code Playgroud)

Mat*_* B. 17

short int类型是由两个字节,在这种情况下0x000x01.在小端系统上,小字节首先出现,因此在内存中显示为0x01后跟0x00.大端系统自然是颠倒过来的.对于小端系统上的短整数,这就是指针的样子:

----------------------- ----------------------- 
|   0x01   |   0x00   | |          |          | 
----------------------- ----------------------- 
   &word                  &word+1
Run Code Online (Sandbox Code Playgroud)

另一方面,字符指针总是按顺序递增.因此,通过获取整数的第一个字节的地址并将其转换为char *指针,您可以按内存顺序递增整数的每个字节.这是相应的图表:

------------ ------------ ------------ ------------ 
|   0x01   | |   0x00   | |          | |          | 
------------ ------------ ------------ ------------ 
   &byte       &byte+1      &byte+2      &byte+3
Run Code Online (Sandbox Code Playgroud)

  • 这是类型惩罚规则的一个例外.通过`char*`指针访问任何数据类型是有效的. (4认同)

Oli*_*rth 7

(char *)&word指向的第一个(最低地址)char(字节)word.如果你的系统是little-endian,这将对应于0x01; 如果它是big-endian,这将对应于0x00.

是的,这个测试应该起作用,无论wordshort,int还是long(只要它们的尺寸大于a char).