编写程序以确定计算机是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 *时,我会得到什么部分?
答案 0 :(得分:33)
如果你有一个小端架构,i
在内存中会是这样的(十六进制):
01 00 00 00
^
如果你有一个大端架构,i
在内存中会是这样的(十六进制):
00 00 00 01
^
转换为char*
会给你一个指向int的第一个字节的指针(我用^
指向),因此char*
指向的值将会如果您使用的是小端架构,则为01
;如果您使用的是大端架构,则为00
。
当您返回该值时,0
会转换为false
而1
会转换为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 = #/*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。