c - 两个 8 位数字相乘

标签 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,为什么会这样?

最佳答案

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 位十进制数字。

关于c - 两个 8 位数字相乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48244149/

相关文章:

c - 打印链表的不同函数

使用用户输入的单词创建并打印链接列表

c - 为什么 scanf() 不将 array 和 &array 视为相同的?

algorithm - 有人可以解释以下异或属性

java - java中32位十六进制转换为十进制

java - 如何将字符串转换为位,然后将其分成两半,对一部分执行一些功能,然后与另一部分进行异或,然后使用java进行交换?

java - 在Java中读取32位无符号整数中的位值

c++ - 从 char 数组中提取十六进制数字

C 仅使用 stdio 库将文件内容读取为字符串

c - 对数组 C 中的字符串进行排序