1

说第一个字节 = 2(十进制)和第二个字节 = 1(十进制)。

因此,第一个字节表示 257(十进制)。因此第二个字节代表 1(十进制)。

所以(总)16 位值是 258(十进制)。

所以如果我这样做:

  (byte1*256)+byte2

这是“正确”的做法吗?或者,还有更好的方法?

谢谢,T。

4

3 回答 3

4

对于大多数现代优化器,没有“正确”的方法:您的代码将被转换为系统上最快的任何东西,其中可能包括

  • 将字节分别加载到下部和上部部分寄存器中 - 不进行任何转换,字节直接加载到它们各自的位置。
  • 移位顶部字节并在低字节中进行 OR-ing - 类似于byte1<<8 | byte2
  • 移位顶部字节并添加低字节- 与上面相同,除了用 a+而不是 an|
  • 在您的系统上快速运行的完全不同的东西- 不同的架构可能具有上述未描述的特定于架构的优化。

在您的源代码中,您应该专注于让人类读者清楚地了解您的意图:如果乘以256对您的读者最有意义,那么使用乘法;如果是位移位,则使用位移位。编译器将负责使您的代码尽可能高效。

于 2013-04-12T02:39:31.713 回答
1

这应该有效:

(byte1<<8) | byte2

但我认为这里可能有一个问题。如果您的byte1byte2数据类型的大小只有 1 个字节(即 8 位),则移位可能无济于事。

我认为你所做的方式应该完全没问题。但是,对于踢球,这样的事情也可能会起作用:

int16 total = byte1;
total = (total<<8) | byte2
于 2013-04-12T02:38:15.663 回答
0

您可以使用移位运算符,它移位: (byte1 << 8) + byte2

左移与乘以 2 的幂相同。在上面的示例中,

(2 << 8) 与 (0b 0000 0010 << 8) 相同,即 (0b 10 0000 0000)。

我们移位 8 位,因为一个字节中有 8 位。

于 2013-04-12T02:38:57.177 回答