将溢出转换为负数

时间:2017-03-22 16:38:28

标签: c overflow

是否有一种简单的方法可以在倒计时用负值替换溢出?

例如32位变量。可能的值为0x00000000 - 0xFFFFFFFF。当我从最低可能值(0x00000000 - 1)中减去1时,结果为0xFFFFFFFF。如何更改操作以得到-1?

的结果

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