有人能为我解释一下"字节序"函数吗?

12

编写一个程序,确定计算机是大端序还是小端序。

bool endianness() {
     int i = 1;
     char *ptr;
     ptr  = (char*) &i;
     return (*ptr);
}

我有上面这个函数,但我不太理解。ptr = (char*) &i,我认为这意味着一个指向字符的指针位于i所在的地址,所以如果一个整数是4个字节,比如ABCD,当你在它上面调用char*时,我们是在谈论A还是D?为什么?

请问是否有人能详细解释一下这个问题?谢谢。

具体来说,ptr = (char*) &i; 当你把它转换成char*时,&i的哪一部分被获取了?


10
如果你将函数命名为 littleEndian(),这样返回 true 就表示体系结构是小端模式,那么它会更易于理解。endianness() == true 不太具有信息含量。 - Graphics Noob
1
它可以更加简洁地写成:bool little_endian(void) { static const int i = 1; return reinterpret_cast<const char&>(i) == 1; } - GManNickG
6个回答

33
如果您使用的是小端架构,i 在内存中的表示形式(十六进制)如下:
01 00 00 00
^

如果您使用的是大端架构,i 在内存中的表示形式如下(16进制):

00 00 00 01
^
将int型变量转换成char*类型指针后,指针将指向该整数的第一个字节(用符号“^”表示)。因此,如果您正在使用小端架构,char*指针所指的值将为“01”,如果您正在使用大端架构,它将为“00”。当您返回该值时,0将被转换为false,而1将被转换为true。 因此,如果您使用的是小端架构,则此函数将返回true;如果您使用的是大端架构,则此函数将返回false。

2
如果ptr指向字节A或D取决于机器的字节序。ptr指向整数中位于最低地址的那个字节(其他字节将在ptr+1等位置)。
在大端字节序的机器上,整数的最高有效字节(为0x00)将存储在该最低地址处,因此该函数将返回零。
在小端字节序的机器上,情况相反,整数的最低有效字节(0x01)将存储在最低地址处,因此该函数将返回一。

1

这是使用类型转换来将整数作为字符数组访问。如果机器是大端序,这将是主要字节,并且将具有零值,但如果机器是小端序,则它将是次要字节,其值为1。(不是将i作为单个整数访问,而是将相同的内存作为四个字符的数组访问)。


0

好的,让我们来看一下:

bool endianness() {
     int i = 1; //This is 0x1:
     char *ptr;
     ptr  = (char*) &i; //pointer to 0001
     return (*ptr);
}

如果机器是小端模式,那么*ptr中的数据将会是0000 0001。
如果机器是大端模式,那么数据将会被反转,也就是i将会……
i = 0000 0000 0000 0001 0000 0000 0000 0000 

所以 *ptr 将会保存 0x0

最后,返回 *ptr 等同于

if (*ptr = 0x1 ) //little endian

else //big endian

0

假设int为4个字节(在C中可能不是)。 这个假设只是为了简化示例...

您可以单独查看这4个字节中的每个字节。

char是一个字节,因此它正在查看4个字节缓冲区的第一个字节。

如果第一个字节非0,则告诉您最低位是否包含在第一个字节中。

我随机选择数字42以避免值1中任何特殊含义的混淆。

int num = 42;
if(*(char *)&num == 42)
{
      printf("\nLittle-Endian\n");
}
else
{
      printf("Big-Endian\n");
}

分解:

int num = 42; 
//memory of the 4 bytes is either: (where each byte is 0 to 255)
//1) 0 0 0 42
//2) 42 0 0 0

char*p = &num;/*Cast the int pointer to a char pointer, pointing to the first byte*/
bool firstByteOf4Is42 = *p == 42;/*Checks to make sure the first byte is 1.*/

//Advance to the 2nd byte
++p;
assert(*p == 0);

//Advance to the 3rd byte
++p;
assert(*p == 0);

//Advance to the 4th byte
++p;
bool lastByteOf4Is42 = *p == 42;
assert(firstByteOf4Is42 == !lastByteOf4Is42);

如果 firstByteOf4Is42 为真,则表示你有小端序。如果 lastByteOf4Is42 为真,则表示你有大端序。

0
无论是字节A还是字节D,都涉及到字节序的核心问题。在小端系统上,整数0x41424344将按照以下方式在内存中排列:0x44 43 42 41(最低有效字节优先;在ASCII中,这是“DCBA”)。在大端系统上,它将被排列为:0x41 42 43 44。指向此整数的指针将保存第一个字节的地址。将指针视为整数指针,您将获得整个整数。将指针视为char指针,您将获得第一个字节,因为char的大小就是一个字节。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接