Did you know?

Jan 24, 2013 16:43

Вы тоже раньше думали, что функция abs() возвращает всегда неотрицательные значения?

=============

#include
#include

main()
{
int a = (int)0x80000000;
int b1 = abs(a);
int b2 = abs(a+1);
printf("%d %d\n", b1, b2);
}

=============

$ gcc 1.c
$ ./a.exe
-2147483648 2147483647

=============

Leave a comment

Comments 11

capt_threepwood January 24 2013, 13:04:00 UTC
ага, а ещё при добавлении единицы к положительному числу модуль уменьшается )

Reply

nickgavr January 25 2013, 04:01:33 UTC
Ну это если переполнение - известная штука. А вот с abs() лично для меня это было новостью :)

Reply


mithraen January 24 2013, 14:26:24 UTC
Вот за что я ненавижу все эти макроассемблеры :)

Reply

nickgavr January 25 2013, 04:00:06 UTC
к слову, изначально я наткнулся на эту фичу в VHDL применительно к Xilinx'ам :-)

Reply

mithraen January 25 2013, 07:55:57 UTC
Вот вечно разработчикам транзисторов на надежность жалко обозвали бы это значение NaN, вместе с корректной обработкой (любые операции над NaN дают NaN), и проблем бы не было. И было бы все логично: 0x7fff + 1 = NaN.
abs(NaN) = NaN.

Только это сломало бы другие хаки, где переполнение используют осознанно.

Reply

nickgavr January 25 2013, 08:17:59 UTC
Сам знаешь, тогда мейнстримом была не надежность, а оптимизация.
Проверил ради интереса в C#, выдает исключение System.OverflowException: "Инвертировать минимальное значение двоичного дополнения невозможно"

Reply


Leave a comment

Up