有人可以为我解释这个“endian-ness”功能吗?

时间:2010-03-28 00:52:54

标签: c++ endianness

编写程序以确定计算机是big-endian还是little-endian。

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

所以我有上述功能。我真的不明白。 ptr =(char *)& i,我认为这意味着指向我所在地址的字符的指针,所以如果一个int是4个字节,比如ABCD,当你调用char *时,我们是在谈论A还是D?在那?为什么?

请有人详细解释一下吗?感谢。

具体而言,ptr =(char *)& i;当你把它投射到char *时,我会得到什么部分?

6 个答案:

答案 0 :(得分:33)

如果你有一个小端架构,i在内存中会是这样的(十六进制):

01 00 00 00
^

如果你有一个大端架构,i在内存中会是这样的(十六进制):

00 00 00 01
^

转换为char*会给你一个指向int的第一个字节的指针(我用^指向),因此char*指向的值将会如果您使用的是小端架构,则为01;如果您使用的是大端架构,则为00

当您返回该值时,0会转换为false1会转换为true。因此,如果你有一个little-endian架构,这个函数将返回true,如果你有一个big-endian架构,它将返回false

答案 1 :(得分:2)

如果ptr指向字节A或D,则取决于计算机的字节顺序。 ptr指向位于最低地址的整数的字节(其他字节位于ptr+1,...)。

在大端机器上,整数的大多数有效字节(即0x00)将存储在该最低地址,因此该函数将返回零。

在litte-endian机器上,相反,整数(0x01)的最小有效字节将存储在最低地址,因此该函数将返回一个这种情况。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

*((char*)&i)是字节A还是字节D是否是字节序的核心。在小端系统上,整数0x41424344将在内存中布局为:0x44 43 42 41(最低有效字节优先;在ASCII中,这是“DCBA”)。在大端系统上,它将被布置为:0x41 42 43 44.指向此整数的指针将保存第一个字节的地址。将指针视为整数指针,并获得整数。将指针视为char指针,然后得到第一个字节,因为这是char的大小。

答案 4 :(得分:0)

当然,

让我们来看看

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

如果机器是Little endian,那么数据将在* ptr中为0000 0001。

如果机器是Big Endian,那么数据将被反转,也就是说,我将

i = 0000 0000 0000 0001 0000 0000 0000 0000 

所以* ptr将保持0x0

最后,return * ptr等同于

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

else //big endian

答案 5 :(得分: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为true,则表示您拥有little-endian。如果lastByteOf4Is42为真,那么你有big-endian。