C unsigned int比较 - 包含自定义位数

时间:2014-07-24 12:46:08

标签: c types unsigned integer-arithmetic

我正在读取一个24位值,目前是uint32_t变量。

将我的头靠在墙上计算两个这样的变量之间的差异,然后思考"它没有签名!为什么这个溢出是一个问题?!",我意识到这些值超出了包含它们的变量的大小。

这是一个柜台,所以人们知道这是一个更大的'比另一个,虽然可能已经溢出。

因此,0x1 - 0x2 = 0xFFFFFFFF,但应该是0x00FFFFFF

我应该如何最好地解决这个问题?

  • 定义类型uint24;
  • 在进行适当的算术之前,
  • if / else更大;
  • 我还没有想到的其他东西?

'最好的'应被解释为最佳做法' /'最可读' /'最安全'

2 个答案:

答案 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);

(live example)

输出:

0x00fffffc

如您所知,0xfffffc表示24位有符号整数中的-4

(请注意,2&#39的补码是不是由C标准规定;我的代码可能不适用于非2补码系统。)