- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
#include <stdio.h>
// Говнокод здесь
#define ABS(x) ((x) ? (x) : (-(x)))
int main () {
char ch = -128;
short sm = -32768;
int i = -2147483647; i--; // здесь
long long l = -9223372036854775807LL; l--; // и здесь декременты нужны
// для подавления варнингов
printf("char:\t\tABS(%hhd) = %hhd\n", ch, ABS(ch));
printf("short:\t\tABS(%hd) = %hd\n", sh, ABS(sh));
printf("int:\t\tABS(%d) = %d\n", i, ABS(i));
printf("long long:\tABS(%lld) = %lld\n", l, ABS(l));
return 0;
}
Может быть, баян, но...
Всем знакомый макрос ABS способен сделать большую гадость.
Вот вывод программы:
char: ABS(-128) = -128
short: ABS(-32768) = -32768
int: ABS(-2147483648) = -2147483648
long long: ABS(-9223372036854775808) = -9223372036854775808
Чего-то я не понял, но это ни какой не abs
Но действительно есть такая фишка, что для minValue нет противоположного положительного значения, т.к. числа кодируются несимметрично.
Ну и в разных языках в этом случае происходят разные забавные вещи.
Мораль: нефиг считать на грани диапазонов.
Для целых типов по крайней мере.
char: ABS(-128) = ?
short: ABS(-32768) = ?
int: ABS(-2147483648) = ?
long long: ABS(-9223372036854775808) = ?
+1.
я вот только что доказывал другу что в .NETe говна хватает и вспомнил винрарнейший говнокод 3117
А потом париться со сравнением +0 и -0.
замечательно!