如何将两个字节转换为一个16位数?

时间:2012-06-01 16:58:04

标签: assembly embedded byte bit

据我所知,1个字节将保存0-255之间的数字。并且16位数字介于0-65535之间。

如果我试图使用两个独立的8位寄存器来表示一个16位数字...我该怎么做?数学如何运作?

谢谢!

3 个答案:

答案 0 :(得分:14)

数学计算如下:

sixteenBitNumber = 256*upperByte + lowerByte;

使用shift和按位操作:

sixteenBitNumber = (upperByte<<8) | lowerByte;

在大多数CPU中,甚至是一些过时的8位CPU,这种解释都是在硬件中完成的:你将字节加载到16位寄存器的部分或者加载到可以作为16位对的单独的8位寄存器中,并且硬件使用数据,就好像它是一个16位数字一样。

答案 1 :(得分:1)

在十进制中如何取7和9并制作79? (7 * 10)+9或12和34并制作1234? (12 * 100)34。没有不同的0x12和0x34并且使得0x1234。 (0x12 * 0x100)+ 0x34。比特移位(0x12 <&lt;&lt; 8)+ 0x34更清晰。你可以或它也是(0x12&lt;&lt; 8)| 0x34。

答案 2 :(得分: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

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