Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
#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
Я, в принципе, ожидал, что заминусуют. Код, действительно, не очень тянет на говнокод. Просто хотел лишний раз обратить внимание на то, как простое решение может породить сложную проблему.
Чему должны быть равны соответствующие значения при правильном, а не простом решении?
char: ABS(-128) = ?
short: ABS(-32768) = ?
int: ABS(-2147483648) = ?
long long: ABS(-9223372036854775808) = ?
Чего-то я не понял, но это ни какой не abs
Но действительно есть такая фишка, что для minValue нет противоположного положительного значения, т.к. числа кодируются несимметрично.
Ну и в разных языках в этом случае происходят разные забавные вещи.
Мораль: нефиг считать на грани диапазонов.
Для целых типов по крайней мере.
char: ABS(-128) = ?
short: ABS(-32768) = ?
int: ABS(-2147483648) = ?
long long: ABS(-9223372036854775808) = ?
+1.
я вот только что доказывал другу что в .NETe говна хватает и вспомнил винрарнейший говнокод 3117
А потом париться со сравнением +0 и -0.
замечательно!