我知道 1 个字节将包含一个 0-255 的数字。一个 16 位的数字在 0-65535 之间。
如果我尝试使用两个单独的 8 位寄存器来表示 16 位数字……我该怎么做?数学是如何工作的?
谢谢!
数学计算如下:
sixteenBitNumber = 256*upperByte + lowerByte;
使用移位和按位运算:
sixteenBitNumber = (upperByte<<8) | lowerByte;
在大多数 CPU 中,即使是一些过时的 8 位 CPU,这种解释都是在硬件中完成的:您将字节加载到 16 位寄存器的一部分或可以作为 16 位对工作的单独的 8 位寄存器中,而硬件像处理单个 16 位数字一样处理数据。
在十进制中,我如何取 7 和 9 并得到 79?(7*10)+9 还是 12 和 34 得到 1234?(12*100)+34。没有不同的 0x12 和 0x34 和 0x1234。(0x12 * 0x100) + 0x34。位移 (0x12 << 8 ) + 0x34 更清晰。你可以或者也可以 (0x12<<8) | 0x34。
你想和他们一起工作吗?这简单
假设您有数字2643 - 以 10 为底。如果你把它分成两半,你会得到像 26 和 43 这样的东西,对吧?你知道,如果你乘以 2,你必须从右到左相乘,然后进位。这样做 - 乘以右侧,如果有溢出,将其添加到左侧,然后乘以左侧。
例如:
(37 82) *2 -> ((37*2) + overflow) + 64 -> (74 + 1) 64 -> 75 64
看看效果如何?除法也一样-需要携带吗?从较高位窃取。想要添加或减去数字?毕竟没那么难!
二进制数的工作方式相同。
(01110110 10110011) * 10 = (0) <- 1110110(1) <- 01100110
基本上你计算下端,然后计算上端,然后应用溢出。