什么是绝对值?

在数学中,绝对值是指一个数与零点的距离,通常用 "|" 符号来表示,如 |x| 表示 x 的绝对值。绝对值不考虑数的符号,所以无论这个数是正数还是负数,它的绝对值都只有一个正数值。

C语言中的绝对值函数

C 语言语言中提供了一个求绝对值的内置函数 - abs()。 abs() 函数在 stdlib.h 头文件中定义,它的参数可以是任意整数类型,并且返回一个对应类型的绝对值。对于浮点数类型,可以调用 fabs() 函数来获取其绝对值。下面是两个例子:

int x = -10;
float y = -2.5;
int abs_x = abs(x);  // abs_x = 10
float abs_y = fabs(y);  // abs_y = 2.5

这两个函数都可以用来计算一个数字的绝对值,但要注意 abs() 函数只能用来处理整数类型。

手写绝对值函数

如果不能使用 abs() 函数怎么办呢?其实我们可以自己手写一个绝对值函数。由于绝对值是指距离,我们只需要判断这个数与 0 的大小关系就能知道它的距离了。因此,一个简单的手写绝对值函数可以是这样的:

int my_abs(int x) {
  if (x >= 0) return x;
  else return -x;
}

当然,这个函数并不是最优的,我们还可以用位运算来提升效率。由于负数的补码是其对应正数的反码加 1,所以对一个数取反再加 1,就等价于对这个数取相反数。因此,下面这个函数运行起来更快一些:

int my_abs(int x) {
  int mask = x >> (sizeof(int) * CHAR_BIT - 1);
  return (x ^ mask) - mask;
}

其中这个 mask 值的计算就是为了求出 x 的符号位,如果 x 是正数,那它的符号位就是 0,否则是 1。我们把这个符号位移到最低位,然后用异或运算取反,再减去原来的符号位,就可以得到它的绝对值了。