我正在读取一个24位值,目前是uint32_t
变量。
将我的头靠在墙上计算两个这样的变量之间的差异,然后思考"它没有签名!为什么这个溢出是一个问题?!",我意识到这些值超出了包含它们的变量的大小。
这是一个柜台,所以人们知道这是一个更大的'比另一个,虽然可能已经溢出。
因此,0x1 - 0x2 = 0xFFFFFFFF
,但应该是0x00FFFFFF
。
我应该如何最好地解决这个问题?
uint24
; if
/ else
更大; '最好的'应被解释为最佳做法' /'最可读' /'最安全'
答案 0 :(得分:6)
要减去(或添加)两个数字并使结果环绕无符号24位数的范围,请使用0xFFFFFF
执行二进制和结果,即(x-y) & 0xFFFFFF
。例如:
(0x1 - 0x2) & 0xFFFFFF == 0xFFFFFF
答案 1 :(得分:1)
首先,您可以使用比较运算符!=
,==
,>
,>=
,<
和<=
。如果你想比较...... {/ p>,你不需要num1 - num2
这样做
无论如何,如果它真的是必要的,只需使用按位AND
uint32_t n1 = 1, n2 = 5;
printf("0x%08x", (n1 - n2) & 0x00ffffff);
输出:
0x00fffffc
如您所知,0xfffffc
表示24位有符号整数中的-4
。
(请注意,2&#39的补码是不是由C标准规定;我的代码可能不适用于非2补码系统。)