- 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
whiskey 12.11.2010 12:05 # 0
Arigato 12.11.2010 12:07 # +5
Чего-то я не понял, но это ни какой не abs
burdakovd 12.11.2010 12:49 # +6
Но действительно есть такая фишка, что для minValue нет противоположного положительного значения, т.к. числа кодируются несимметрично.
Ну и в разных языках в этом случае происходят разные забавные вещи.
Мораль: нефиг считать на грани диапазонов.
whiskey 12.11.2010 12:54 # −8
absolut 12.11.2010 13:18 # +3
Для целых типов по крайней мере.
whiskey 12.11.2010 12:57 # −2
sectus 12.11.2010 13:28 # +5
char: ABS(-128) = ?
short: ABS(-32768) = ?
int: ABS(-2147483648) = ?
long long: ABS(-9223372036854775808) = ?
3.14159265 12.11.2010 14:16 # 0
+1.
я вот только что доказывал другу что в .NETe говна хватает и вспомнил винрарнейший говнокод 3117
rat4 12.11.2010 13:56 # 0
Анонимус 12.11.2010 15:14 # 0
eth0 12.11.2010 20:57 # −1
absolut 12.11.2010 22:40 # 0
А потом париться со сравнением +0 и -0.
eth0 13.11.2010 00:40 # +2
absolut 13.11.2010 09:25 # 0
TarasB 13.11.2010 12:57 # +1
absolut 13.11.2010 13:07 # 0
absolut 13.11.2010 13:06 # 0
bugmenot 12.11.2010 15:42 # −1
da4ever 13.11.2010 08:47 # −1
замечательно!