当我读一篇关于Big / Little Endian的文章时,我很困惑。
代码如下:
#include <iostream>
using namespace std;
int i = 12345678;
int main()
{
char *p = (char*)&i; //line-1
if(*p == 78) //line-2
cout << "little endian" << endl;
if(*p == 12)
cout << "big endian" << endl;
}
问题:
在第1行中,我可以使用static_cast<char*>(&i)
进行转换吗?
在第2行中,根据代码,如果它是little-endian,则78
存储在最低字节中,否则12
存储在最低字节中。但我认为,i = 12345678;
将以二进制形式存储在内存中。
如果它是little-endian,那么i
二进制文件的最后一个字节将存储在最低字节中,但我不明白的是它如何保证{{1}的最后一个字节是i
?
就像78
,然后i = 123;
的二进制文件是i
一样,是否可以保证在little-endian中,01111011
存储在最低字节中?
答案 0 :(得分:9)
我更喜欢reinterpret_cast
。
Little-endian和big-endian指的是 bytes 的方式,即8位数量,存储在内存中,不是两位小数。如果i
的值为0x12345678
,那么您可以检查0x78
和0x12
以确定字节顺序,因为两个十六进制数字对应于一个字节(在所有硬件上)我编程了。)
答案 1 :(得分:4)
这里有两个不同的概念:
现在,12345678是一个十进制数,其二进制(base2)表示为101111000110000101001110。不容易检查,主要是因为base2表示不能精确地分组到一个十进制数字。 (没有整数x,因此2 x 给出10)。 十六进制数更容易拟合:2 4 = 16和2 8 = 16 2 = 256。
因此十六进制数0x12345678形成字节0x12-0x34-0x56-0x78。 现在很容易检查第一个是0x12还是0x78。
(注意:12345678的十六进制表示为0x00BC614E,其中0xBC为188,0x61为97,0x4E为78)
答案 2 :(得分:1)
static_cast
是老式C风格演员阵容的新风格替代品,但在这里并不合适; reinterpret_cast
适用于您完全更改数据类型的时间。
此代码根本不起作用 - 字节不包含偶数个十进制数字!十进制数字的数字与存储在内存中的字节一一对应。例如,十进制500可以作为0x01F4存储在两个字节中。 “01”代表256,“F4”代表另外244,总共500.你不能说“500”中的“5”是这两个字节中的任何一个 - 没有直接的对应关系。
答案 3 :(得分:0)
应该是
unsigned char* p = (unsigned char*)&i;
您不能使用static_cast。只有reinterpret_cast。