我试图将两个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 = 5
和Lo = 176
,为什么会这样?
a*b
的结果是
0000 0101 1011 0000
( 5 )( 176 )
那是你印的。你把十进制表示与其他人混在一起。您看到的值不像0001 0100 0101 0110
那样存储。如果是的话,那么是的,你会得到你想要的结果(但这是有道理的,它会有多大帮助)。
为了得到你想要的东西,你可以考虑使用c%100
和c/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位十进制数。
如果你想要十进制表示(由于十进制不均匀地划分字节值没有意义),你需要使用/ 100和%100而不是按位运算。