【发布时间】:2018-02-16 17:40:00
【问题描述】:
我已经声明了 4 个无符号变量:
uint32_t empty_bucket;
uint32_t base_bucket;
uint32_t hop_size;
uint32_t ht_size;
我要执行签名条件检查:
if (empty_bucket < base_bucket + (hop_size - 1) - ht_size)
知道base_bucket + (hop_size - 1) - ht_size 可能是负值。操作数的正确转换是什么来执行这个单独的操作?
注意:base_bucket + (hop_size - 1) - ht_size 可能与 -2^32 非常接近,因此转换为带符号的 32 位 int32_t 可能会导致溢出。
【问题讨论】:
-
不清楚你在问什么。根据定义,无符号整数不能变为负数。差异也不会变成负数。 无符号整数的上溢/下溢 回绕,但结果仍然是正数(阅读模数运算)。如果将表达式的操作数强制转换为有符号,则会调用未定义的行为。
-
@Olaf 确实有道理。
base_bucket + (hop_size - 1) - ht_size可能是否定的。读作:数学上这个表达式可以是负数,但在 C 中,因为我使用无符号类型,所以我得到无符号模数行为。如何使我的 C 代码表现得像数学模型? -
@bolov:是的,但前提是
int大于uint32_t。否则不能。你想回顾一下关于算术运算符的章节。但是为什么你有一个 sock-puppet 帐户呢? -
@Olaf 袜子木偶账号?什么意思?
-
是否有某些原因不能将条件更改为:
if (empty_bucket + ht_size < base_bucket + (hop_size - 1))?
标签: c casting integer unsigned signed