| 11:03a |
А представлениями в компьютере я заинтересовался после того, как пытался разобраться с хаскеловским генератором псевдослучайных чисел, и наткнулся на такое место:
-- We want a non-negative number, but we can't just take the abs -- of sMaybeNegative as -minBound == minBound. s = sMaybeNegative .&. maxBound
Вот и решил разобраться глубже и переизобрести signed magnited и дополнительный код. Как bigint-ы, но имея в виду и fixed-width. Теперь эта тема настолько заинтересовала, что нужно будет и дальше её развивать (схемотехника, калькуляторы, negabinary).
Ну, а снипет сверху уже очевиден. Не знал, однако, но действительно, abs(INT_MIN) = INT_MIN: в си и подобных языках модуль этого отрицательного числа даёт его же, и теперь очевидно, почему.
В новом стандарте си даже SCHAR_MIN декларируется как -127, а не -128. Впрочем, вряд ли хоть один компилятор реализует это так (ну, может, олдовые компиляторы на мейнфреймы с обратным кодом). И остальные ..._MIN-ы аналогично, и все рэнджи на 1 меньше, чем в реальности. Вот уж представляю, какие проблемы начнутся в прогах, если их "правильным" си компилить.
Пробежался по 50+ файлам limits.h у меня на диске: все определяют как -128 и т.п. Ничо себе у меня си-компиляторов накопилось, оказывается. Даже по AVR затесался один. |