将两个8位数相乘

时间:2018-01-13 20:46:31

标签: c bit

我试图将两个8位数相乘并将16位结果存储在两个8位变量中,例如: 91 * 16 = 1456 高= 14,低= 56 这是我使用的代码,但没有获得理想的结果。有人可以指出我的错误吗?

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
#include<time.h>

int main()
{
  uint8_t a = 91;
  uint8_t b = 16;
  uint16_t c = a*b;
  printf("Value at c is %d \n",c);
  uint8_t lo = c & 0x00FF;
  uint8_t hi = c >> 8;
  printf("Hi and lo value are %d and %d \n",hi,lo);
  return 0;
}

我得到Hi = 5Lo = 176,为什么会这样?

2 个答案:

答案 0 :(得分:1)

a*b的结果是

0000 0101  1011 0000
(  5     )(   176   )

这就是你打印的内容。 你把十进制表示与其他人混在一起。您看到的值不会像0001 0100 0101 0110那样存储。如果是,那么是的,你会得到你的期望的结果(但是它有多大帮助是有争议的。)

要获得您想要的内容,您可以考虑使用c%100c/100。(您获得hi中最重要的2位数字,并在lo中取两位数字)。

  uint8_t lo = c %100;
  uint8_t hi = c /100;

正确打印

printf("%" PRIu8 "\n", lo); //56
printf("%" PRIu8 "\n", hi); //14

以这种方式准确printf("Hi and lo value are %" PRIu8" and %"PRIu8" \n",hi,lo);

请注意,任何2位正整数都可以放在uint8_t中,但为了更通用,您可能需要考虑有时结果乘法可以是5位十进制数。

答案 1 :(得分:0)

如果你想要十进制表示(由于十进制不均匀地划分字节值而没有意义),你需要使用/ 100和%100而不是按位运算。