整数如何存储在内存中?

时间:2011-09-21 12:03:46

标签: c++ endianness

当我读一篇关于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. 在第1行中,我可以使用static_cast<char*>(&i)进行转换吗?

  2. 在第2行中,根据代码,如果它是little-endian,则78存储在最低字节中,否则12存储在最低字节中。但我认为,i = 12345678;将以二进制形式存储在内存中。

    如果它是little-endian,那么i二进制文件的最后一个字节将存储在最低字节中,但我不明白的是它如何保证{{1}的最后一个字节是i

    就像78,然后i = 123;的二进制文件是i一样,是否可以保证在little-endian中,01111011存储在最低字节中?

4 个答案:

答案 0 :(得分:9)

  1. 我更喜欢reinterpret_cast

  2. Little-endian和big-endian指的是 bytes 的方式,即8位数量,存储在内存中,不是两位小数。如果i的值为0x12345678,那么您可以检查0x780x12以确定字节顺序,因为两个十六进制数字对应于一个字节(在所有硬件上)我编程了。)

答案 1 :(得分:4)

这里有两个不同的概念:

  1. 数字以二进制格式存储。 8bits代表一个字节,整数可以使用1,2,4甚至8或1024字节,具体取决于它们运行的​​平台。
  2. Endiannes是内存中的字节顺序(不太重要的第一个 - LE,或最重要的第一个 - BE)
  3. 现在,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)

  1. static_cast是老式C风格演员阵容的新风格替代品,但在这里并不合适; reinterpret_cast适用于您完全更改数据类型的时间。

  2. 此代码根本不起作用 - 字节不包含偶数个十进制数字!十进制数字的数字与存储在内存中的字节一一对应。例如,十进制500可以作为0x01F4存储在两个字节中。 “01”代表256,“F4”代表另外244,总共500.你不能说“500”中的“5”是这两个字节中的任何一个 - 没有直接的对应关系。

答案 3 :(得分:0)

应该是

unsigned char* p = (unsigned char*)&i;

您不能使用static_cast。只有reinterpret_cast。