是否有一种简单的方法可以在倒计时用负值替换溢出?
例如32位变量。可能的值为0x00000000 - 0xFFFFFFFF。当我从最低可能值(0x00000000 - 1)中减去1时,结果为0xFFFFFFFF。如何更改操作以得到-1?
的结果答案 0 :(得分:1)
是否有一种简单的方法可以在倒计时用负值替换溢出?
使用更广泛的数学是一种直接的方法。
“示例为32位变量。可能的值为0x00000000 - 0xFFFFFFFF”表示该变量是某些无符号类型,如uint32_t
。
从OP报告的(uint32_t)0
中减去1 (uint32_t)0xFFFFFFFF
。因此,请使用更宽的签名数学,例如long long
(至少为64位)或int64_t
// Insure subtraction is done using `long long` math with 1LL
long long result = var_uint32_bit - 1LL;
或者代码可以使用相应的相同宽度签名类型。
// Only non-implementation defined for values 0...0x7FFFFFFF
int32_t result = (int32_t)var_uint32_bit - 1;
(int32_t)var_uint32_bit
对 unsigned 类型转换为签名整数类型有限制。
否则,新类型已签名且值无法在其中表示;结果是实现定义的,或者引发实现定义的信号。 C11dr§6.3.1.33