我正在读取一个24位的值,现在变成一个uint32_t
变量。
我的头撞在墙上,计算出这两个变量之间的差异,然后想“这是无符号的!为什么溢出是个问题?!”,我意识到这些值的大小已经超出了包含它们的变量的大小。
这是一个计数器,因此已知其中一个比另一个“大”,尽管可能已溢出。
因此,0x1 - 0x2 = 0xFFFFFFFF
,但应该是0x00FFFFFF
。
我该如何处理这个问题?
定义类型uint24
;if
/else
在进行适当的运算之前,该值较大;
还有什么我没想到的?
“最佳”应解释为“最佳实践”/“最可读”/“最安全”。
最佳答案
若要减去(或相加)两个数字并使结果环绕无符号24位数字的范围,请使用0xFFFFFF
,即(x-y) & 0xFFFFFF
对结果执行二进制运算。例如:
(0x1 - 0x2) & 0xFFFFFF == 0xFFFFFF