如何确保对无符号整数的操作不会导致换行
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 会在比较之前换行吗?
这是正确的做法吗?再一次,如果我现在知道在比较之前临时操作是如何存储的,我会得到我的答案。
假设二进制补码。
给定两个无符号整数var1
和var2
,var1 - var2
的类型是unsigned int
,存储到signed int
时可能会导致溢出。要确定是否溢出,您可以执行类似 var1 - var2 > INT_MAX
的操作,其中 INT_MAX
将在比较之前隐式转换为 unsigned int
。
在 var1 < var2
的情况下,var1 - var2
的结果仍然是 unsigned int
类型,并且可能会在下溢的情况下被换行。例如,0 - UINT_MAX
将导致 1
。在这种情况下,我建议你交换 var1
和 var2
然后相应地确定。像
if (var1 >= var2) {
if (var1 - var2 > INT_MAX) // overflow
else // good
}
else {
if (var2 - var1 > INT_MAX + 1u) // underflow
else // good
}
我有两个无符号整数,我需要计算它们之间的差异并将其存储在一个有符号变量中
unsigned int var1, var2;
signed int diff;
diff = (signed)var1 - var2;
这会导致换行,因为 var1 和 var2 都是无符号的吗? 在分配给 diff 之前,两者的临时差异 存储在哪里。如果这是有符号变量,那么它不会换行,否则它应该换行。
类似的话, 我们可以这样做吗 -
var1 - var2 > signed_int_max
假设 var1 < var2 在这种情况下我的 var1-var2 会在比较之前换行吗?
这是正确的做法吗?再一次,如果我现在知道在比较之前临时操作是如何存储的,我会得到我的答案。
假设二进制补码。
给定两个无符号整数var1
和var2
,var1 - var2
的类型是unsigned int
,存储到signed int
时可能会导致溢出。要确定是否溢出,您可以执行类似 var1 - var2 > INT_MAX
的操作,其中 INT_MAX
将在比较之前隐式转换为 unsigned int
。
在 var1 < var2
的情况下,var1 - var2
的结果仍然是 unsigned int
类型,并且可能会在下溢的情况下被换行。例如,0 - UINT_MAX
将导致 1
。在这种情况下,我建议你交换 var1
和 var2
然后相应地确定。像
if (var1 >= var2) {
if (var1 - var2 > INT_MAX) // overflow
else // good
}
else {
if (var2 - var1 > INT_MAX + 1u) // underflow
else // good
}