使用无符号类型时,会发生模运算(也称为“环绕”行为)。 要理解这种模块化算法,只需看看这些时钟:
9 + 4 = 1(13 mod 12),所以另一个方向是:1 - 4 = 9(-3 mod 12)。 使用无符号类型时应用相同的原则。 如果结果类型为unsigned,则进行模运算。
现在看一下将结果存储为abs()的以下操作:
unsigned int five = 5, seven = 7;
unsigned int a = five - seven; // a = (-2 % 2^32) = 4294967294
int one = 1, six = 6;
unsigned int b = one - six; // b = (-5 % 2^32) = 4294967291
如果要确保结果为abs(),则将其存储到signed变量中或将其转换为signed.如果要获取数字之间的差异并确保不应用模运算,则应考虑使用 abs()函数在stdlib.h中定义:
int c = five - seven; // c = -2
int d = abs(five - seven); // d = 2
要非常小心,特别是在写条件时,因为:
if (abs(five - seven) < seven) // = if (2 < 7)
// ...
if (five - seven < -1) // = if (-2 < -1)
// ...
if (one - six < 1) // = if (-5 < 1)
// ...
if ((int)(five - seven) < 1) // = if (-2 < 1)
// ...
但
if (five - seven < 1) // = if ((unsigned int)-2 < 1) = if (4294967294 < 1)
// ...
if (one - six < five) // = if ((unsigned int)-5 < 5) = if (4294967291 < 5)
// ...