编写程序以确定计算机是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 回答
假设int是4个字节(在C中它可能不是) . 这个假设只是为了简化示例......
您可以分别查看这4个字节中的每个字节 .
char
是一个字节,所以它正在查看4字节缓冲区的第一个字节 .如果第一个字节为非0,那么它会告诉您第一个字节中是否包含最低位 .
我随机选择了数字42,以避免在值1中混淆任何特殊含义 .
Breakdown:
如果firstByteOf4Is42为真,你就有了小端 . 如果lastByteOf4Is42为true,那么你有big-endian .
*((char*)&i)
是字节A还是字节D是否是字节序的核心 . 在小端系统上,整数0x41424344将在内存中布局为:0x44 43 42 41(最低有效字节优先;在ASCII中,这是"DCBA") . 在大端系统上,它将被布置为:0x41 42 43 44.指向此整数的指针将保存第一个字节的地址 . 将指针视为整数指针,并获得整数 . 将指针视为char指针,然后得到第一个字节,因为这是char的大小 .当然,
让我们来看看
如果机器是Little endian,则数据将在* ptr中为0000 0001 .
如果机器是Big Endian,那么数据将被反转,也就是说,我将是
所以* ptr将保持0x0
最后,return * ptr相当于
如果
ptr
指向字节A或D取决于机器的字节顺序 .ptr
指向位于最低地址的整数的字节(其他字节位于ptr+1
,...) .在大端机器上,整数的最高有效字节(即
0x00
)将存储在该最低地址,因此该函数将返回零 .在litte-endian机器上相反,整数(
0x01
)的最低有效字节将存储在最低地址,因此在这种情况下函数将返回一个 .这是使用类型punning来访问整数作为字符数组 . 如果机器是大端,这将是主要字节,并且将具有零值,但如果机器是小端,则它将是次要字节,其值为1 . (不是将
i
作为单个整数访问,而是将相同的内存作为四个字符的数组进行访问) .如果你有一个小端架构,
i
在内存中会是这样的(十六进制):如果你有一个big-endian架构,
i
在内存中会是这样的(十六进制):转换为
char*
给你一个指向int的第一个字节的指针(我用^
指向),所以char*
指向的值将是01
,如果你是一个小端架构,00
如果你是一个大端架构 .返回该值时,
0
将转换为false
,1
将转换为true
. 所以,如果你有一个little-endian架构,这个函数将返回true
,如果你有一个big-endian架构,它将返回false
.