8位无符号整数相乘拆分结果不符预期,求错误排查
问题分析:8位无符号整数相乘后的字节拆分误解
看起来你混淆了十进制数的字面拆分和计算机中二进制字节拆分的概念!你的代码本身逻辑是正确的,问题出在你对“高8位”“低8位”的预期理解有误,咱们一步步理清楚:
核心误解:十进制字面拆分 vs 二进制字节拆分
你提到91*16=1456,预期高8位是14、低8位是56——这是把十进制数1456直接按数字位数拆成了前后两部分,但计算机中的16位整数拆分是基于二进制字节的,基数是256,不是十进制的100。
正确的字节拆分计算
我们来算一下1456的正确字节分解:
- 1456 转换成十六进制是
0x5B0,对应二进制是00000101 10110000(分成两个8位字节) - 低8位是二进制的后8位
10110000,转换成十进制就是 176(和你代码输出的Lo值一致) - 高8位是二进制的前8位
00000101,转换成十进制就是5(和你代码输出的Hi值一致)
换一种计算方式(用整数除法和取余):
- 高8位 = 总数值 ÷ 256(整数除法):
1456 / 256 = 5 - 低8位 = 总数值 % 256(取余):
1456 % 256 = 176
你的代码为什么是对的
再看你的代码逻辑:
uint16_t c = a*b;:这里a和b是uint8_t,计算时会自动提升为int,得到正确的1456后赋值给uint16_t类型的c,没问题uint8_t lo = c & 0x00FF;:用位与操作保留低8位,丢弃高8位,正确uint8_t hi = c >> 8;:把16位值右移8位,原本的高8位就到了低8位的位置,得到正确的高8位数值,正确
如果你的实际需求是把十进制数的字符串形式拆分成前后两位,那需要用字符串处理逻辑,但如果是要获取16位整数的两个8位字节部分,你的代码完全正确,只是预期结果错了~
内容的提问来源于stack exchange,提问作者Tanushree Banerjee
相关产品推荐
相关产品推荐

