据我所知,1个字节将保存0-255之间的数字。并且16位数字介于0-65535之间。
如果我试图使用两个独立的8位寄存器来表示一个16位数字...我该怎么做?数学如何运作?
谢谢!
答案 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
基本上你计算下端,然后计算上端,然后你应用溢出。