在这个字节公式中
y=(((x[0]<<8)+x[1])*1);
x[0]
会引用最左边的字节还是最右边的字节?
让我们用十六进制表示,数字x是10DF
,结果是什么?
答案 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。