11

我知道 1 个字节将包含一个 0-255 的数字。一个 16 位的数字在 0-65535 之间。

如果我尝试使用两个单独的 8 位寄存器来表示 16 位数字……我该怎么做?数学是如何工作的?

谢谢!

4

3 回答 3

18

数学计算如下:

sixteenBitNumber = 256*upperByte + lowerByte;

使用移位和按位运算:

sixteenBitNumber = (upperByte<<8) | lowerByte;

在大多数 CPU 中,即使是一些过时的 8 位 CPU,这种解释都是在硬件中完成的:您将字节加载到 16 位寄存器的一部分或可以作为 16 位对工作的单独的 8 位寄存器中,而硬件像处理单个 16 位数字一样处理数据。

于 2012-06-01T17:10:24.053 回答
2

在十进制中,我如何取 7 和 9 并得到 79?(7*10)+9 还是 12 和 34 得到 1234?(12*100)+34。没有不同的 0x12 和 0x34 和 0x1234。(0x12 * 0x100) + 0x34。位移 (0x12 << 8 ) + 0x34 更清晰。你可以或者也可以 (0x12<<8) | 0x34。

于 2012-06-01T20:55:42.050 回答
0

你想和他们一起工作吗?这简单

假设您有数字2643 - 以 10 为底。如果你把它分成两半,你会得到像 26 和 43 这样的东西,对吧?你知道,如果你乘以 2,你必须从右到左相乘,然后进位。这样做 - 乘以右侧,如果有溢出,将其添加到左侧,然后乘以左侧。

例如:

(37 82) *2     ->     ((37*2) + overflow) + 64     ->     (74 + 1) 64     ->     75 64

看看效果如何?除法也一样-需要携带吗?从较高位窃取。想要添加或减去数字?毕竟没那么难!

二进制数的工作方式相同。

(01110110 10110011) * 10 = (0)     <-     1110110(1)     <-     01100110

基本上你计算下端,然后计算上端,然后应用溢出。

于 2012-10-15T04:26:51.473 回答