如何确保对无符号整数的操作不会导致换行

How to ensure that operations on unsigned integers do not result in wrap

我有两个无符号整数,我需要计算它们之间的差异并将其存储在一个有符号变量中

unsigned int var1, var2;
signed int diff;
diff = (signed)var1 - var2;

这会导致换行,因为 var1 和 var2 都是无符号的吗? 在分配给 diff 之前,两者的临时差异 存储在哪里。如果这是有符号变量,那么它不会换行,否则它应该换行。

类似的话, 我们可以这样做吗 -

var1 - var2 > signed_int_max

假设 var1 < var2 在这种情况下我的 var1-var2 会在比较之前换行吗?

这是正确的做法吗?再一次,如果我现在知道在比较之前临时操作是如何存储的,我会得到我的答案。

假设二进制补码。

给定两个无符号整数var1var2var1 - var2的类型是unsigned int,存储到signed int时可能会导致溢出。要确定是否溢出,您可以执行类似 var1 - var2 > INT_MAX 的操作,其中 INT_MAX 将在比较之前隐式转换为 unsigned int

var1 < var2 的情况下,var1 - var2 的结果仍然是 unsigned int 类型,并且可能会在下溢的情况下被换行。例如,0 - UINT_MAX 将导致 1。在这种情况下,我建议你交换 var1var2 然后相应地确定。像

  if (var1 >= var2) {
    if (var1 - var2 > INT_MAX) // overflow
    else // good
  }
  else {
    if (var2 - var1 > INT_MAX + 1u) // underflow
    else // good
  }