我想在无符号数中进行一些算术运算,需要取负整数的绝对值,类似于
do_some_arithmetic_in_unsigned_mode(int some_signed_value)
{
unsigned int magnitude;
int negative;
if(some_signed_value<0) {
magnitude = 0 - some_signed_value;
negative = 1;
} else {
magnitude = some_signed_value;
negative = 0;
}
...snip...
}
但是使用INT_MIN可能会存在问题,如果在有符号算术中执行0-INT_MIN操作就会产生UB(未定义行为)。那么,在C语言中有什么标准/稳健/安全/高效的方法来解决这个问题呢?
编辑:
如果我们知道我们处于2的补码环境中,也许隐式转换和显式位运算是标准的方式?如果可能的话,我想避免这种假设。
do_some_arithmetic_in_unsigned_mode(int some_signed_value)
{
unsigned int magnitude=some_signed_value;
int negative=some_signed_value<0;
if (negative) {
magnitude = (~magnitude) + 1;
}
...snip...
}
UINT_MAX == INT_MAX == -(INT_MIN+1)
,那么无论如何都无法用无符号整数来表示|INT_MIN|
=) - Daniel Fischerunsigned int
比int
多一个填充位的情况。我从未听说过这种情况的实现,但标准并不保证它永远不会发生。(除非我漏看了什么。) - Daniel Fischer(unsigned)INT_MIN != 0
即使绝对值不适合也是正确的。如果您希望函数返回unsigned int
,则“Fischer条件”是必要且充分的,但是正确的测试并不那么简单... - Steve Jessoplong/unsigned long
是 64 位的,除了unsigned long
有一个填充位。似乎处理器没有 64 位 unsigned 原生的*,/
指令,所以他们采取了简单的方式。 - chux - Reinstate Monica