Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет superhuman ([info]superhuman)
@ 2017-05-07 11:03:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
А представлениями в компьютере я заинтересовался после того, как пытался разобраться с хаскеловским генератором псевдослучайных чисел, и наткнулся на такое место:

-- 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 затесался один.