【发布时间】:2014-09-16 00:42:50
【问题描述】:
我正在读取一个 24 位值,目前是一个 uint32_t 变量。
在计算两个这样的变量之间的差异时,我的头撞到了墙上,并想“它是无符号的!为什么这个溢出是个问题?!”,我意识到这些值溢出了包含它们的变量的大小。
这是一个计数器,因此已知一个比另一个“大”,尽管可能已经溢出。
因此,0x1 - 0x2 = 0xFFFFFFFF,但应该是0x00FFFFFF。
我应该如何最好地处理这个问题?
- 定义一个类型
uint24; -
if/else在进行适当的算术运算之前较大; - 还有什么我没想到的?
“最佳”应解释为“最佳实践”/“最易读”/“最安全”。
【问题讨论】:
-
1.你能举一个你遇到的问题的例子吗?有输入和预期结果。 2. 减法的结果是有符号还是无符号?
-
@interjay 结果也是无符号的——这是一个计数器,所以知道一个更大;签名结果将毫无意义/浪费 MSb。
-
那我不明白是什么问题。如果从较大的数字中减去较小的数字,则不会溢出。
-
@interjay 好吧
0x1 - 0x2将是0xFFFFFFFF,但应该是0xFFFFFF。 -
我不明白你为什么使用
-运算符来比较两个数字,因为你有很多关系/相等运算符<、<=、!=等等。我同意一些独立的示例会很有用。
标签: c types unsigned integer-arithmetic