正如我所读到的,在有符号算术中存在许多未定义行为的情况。因此,我更喜欢使用无符号算术来计算结果(甚至是有符号的),这是在没有未定义情况的情况下指定的。
但是,当使用无符号算术获得结果时,最后一步,即转换为有符号值仍有待完成。
这是我编写的代码,我的问题是代码是否按照规则工作,即它是否安全,不依赖于一些未定义/未指定的行为?
/*
function to safely convert given unsigned value
to signed result having the required sign
sign == 1 means the result shall be negative,
sign == 0 means the result shall be nonnegative
returns 1 on success, 0 on failure
*/
int safe_convert(unsigned value, int sign, int *result) {
if (sign) {
if (value > -(unsigned)INT_MIN) return 0; // value too big
if (!value) return 0; // cannot convert zero to negative int
*result = INT_MIN + (int)((-(unsigned)INT_MIN) - value);
} else {
if (value > (unsigned)INT_MAX) return 0; //value too big
*result = (int)value;
}
return 1;
}
最终,有没有一种更简单的方法,不依赖于未定义/未指定的行为并做同样的事情?