字节编号问题

时间:2011-06-27 22:10:45

标签: c++

在这个字节公式中

y=(((x[0]<<8)+x[1])*1);

x[0]会引用最左边的字节还是最右边的字节?

让我们用十六进制表示,数字x是10DF,结果是什么?

4 个答案:

答案 0 :(得分:2)

x[0]指的是数字中最左边的字节,即靠近地址空间开头的字节。

如果这两个字节包含数字0x10DF,如果系统是小端,x[0]是0xDF,如果系统是大端,则{0}是0x10。如果我们假设代码位只是试图从内存中提取数字,我会想到内存中的数字是大端,因为它是左移(乘以)第一个字节,这意味着它更重要。

答案 1 :(得分:1)

<< shift left 运算符,所以显然x[0]正在向左移动。它将是0x10的{​​{1}}。

修改

澄清 - 我假设0x10DF是结果的值 - 0x10DF

答案 2 :(得分:1)

假设x是一个多字节值,x的“左侧”(或更准确地说是重要性)依赖于您正在使用的任何架构的字节序:

http://en.wikipedia.org/wiki/Endianness

在x86上,较高的地址字节是更重要的值。

编辑:感谢Rob早先发现错字

答案 3 :(得分:1)

Endianness不是一个问题,因为不涉及指针转换。假设我们有:

unsigned char x[] = { 0xAB, 0xEF };

然后,以下代数表达式完全可移植且与表示无关:

unsigned int y = (x[0] << 8) + x[1]

结果将始终为y == 0xABEF。 (假设我们有CHAR_BITS == 8。)

如何将它放在内存中是完全不同的, 取决于机器的字节顺序。这些信息可以通过类型惩罚来访问:

uint16_t z = *(uint16_t*)(x);

现在在内存中 z的布局为AB EF,无论这意味着什么:大端的0xABEF和小端系统的0xEFAB。