为什么这些位反转?

时间:2014-01-18 10:14:07

标签: c++

在下面的代码中,我试图在2 int s中存储2个字节char。然后,我尝试在屏幕上显示我存储的号码。这些部分运作良好。

如果我试图看到另一方面我存储的数字的二进制形式,我得不到我所期望的。 256给了我00000000 1,而正确的是10000000 0

unsigned int num = 256;
unsigned int pos = 0;

unsigned char a[2] = {num << pos, ((num << pos) & 0xFF00) >> 8};
//we store the number in 2 bytes

cout << (((unsigned int)a[0] + ((unsigned int)a[1] << 8)) >> pos) << endl;
//we check if the number we stored is the num

for(int i = 0; i < 2; i++)//now we display the binary version of the number
{
    for(int j = 0; j < 8; j++)
        cout << ((a[i] >> j)&1);
    cout << " ";
}

有人可以解释一下我做错了吗?

3 个答案:

答案 0 :(得分:1)

变化:

cout << ((a[i] >> j)&1);

要:

cout << ((a[i] >> (8-j-1))&1);

或改变:

for(int j = 0; j < 8; j++)

要:

for(int j = 8-1; j >= 0; j--)

答案 1 :(得分:1)

unsigned char a[2] = {num << pos, ((num << pos) & 0xFF00) >> 8};

表示将低位存储在[1]中的[0]和高位中。

256 = 1 00000000
a[0] = 00000000
a[1] = 00000001

for(int j = 0; j < 8; j++)(最低有效位优先)应为for(int j = 7; j >=0; j--)(最高有效位优先)

答案 2 :(得分:1)

数字首先存储在具有最低有效位的存储器中。

可以这样想:数字456在10 ^ 0处有6个,10 ^ 1处有5个等等。将它存储为“654”(其中 i'th 字符串的字符对应于第10个数字。

计算机以相同的方式存储数字:数字的第一位代表第2 ^ 0位,第i位位于2 ^第i位。

这条规则实际上是Big Endian的一半,这是一种在内存中存储从最大到最小的十六进制数字的方式(人类可读的方式)。

相关问题