C语言 将溢出转换为负数



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

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

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

使用更广泛的数学是一种直接的方法。

"示例一个 32 位变量。可能的值是 0x00000000 - 0xFFFFFFFF"表示变量是一些无符号类型,如 uint32_t


(uint32_t)0中减去 1 是 OP 报告的(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将无符号类型转换为有符号整数类型有限制。

否则,新类型是有符号的,并且无法在其中表示值;结果要么是实现定义的,要么是实现定义的信号。C11dr §6.3.1.3 3

最新更新