Про целочисленные типы
Apr. 5th, 2016 10:38 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Интересно, что количество бит в самом большом целочисленном типе, поддерживаемом современными компиляторами (int128_t), уже сравнялось с максимальным значением самого маленького (signed char).
Это к вопросу о том, как интерпретировать x << -1.
Мне пришли в голову две «естественные» интерпретации:
1. x << -1 = x >> 1.
2. x << -1 = x<< ((usigned что-то)-1) = x << 255 или x << 65535 и так далее.
В обоих случаях 1 << -1 = 0.
Но не все компиляторы с этим согласны. (понятно что по стандарту это undefined behavoir).
Это к вопросу о том, как интерпретировать x << -1.
Мне пришли в голову две «естественные» интерпретации:
1. x << -1 = x >> 1.
2. x << -1 = x<< ((usigned что-то)-1) = x << 255 или x << 65535 и так далее.
В обоих случаях 1 << -1 = 0.
Но не все компиляторы с этим согласны. (понятно что по стандарту это undefined behavoir).
no subject
Date: 2016-04-05 09:57 am (UTC)хождения строемпростого и читаемого кода. Собственно, нет причин для спора.Однако, мне действительно интересно, где в современном мире могут быть всерьез нужны фокусы с булевой арифметикой ? Навскидку приходят в голову только IP адреса и маски, потому что, на сколько я понимаю, сейчас даже контроллер осещения в "умном доме" тупо дешевле сделать на x64, под линуксом и, соответственно, с полным набором языков высокого уровня.
BTW, мб вспомним фидошные времена и перейдем на ты ?
no subject
Date: 2016-04-05 11:13 am (UTC)Даже самый простой и читаемый код может оказаться неработоспособным просто из-за того, что входящие данные незаметно сменили кодировку "на низком уровне".
фокусы с булевой арифметикой
...
тупо дешевле сделать на x64, под линуксом и, соответственно, с полным набором языков высокого уровня.
То есть НЕ СЛЕДУЕТ ВООБЩЕ употреблять "данных низкого уровня" и обрабтку "низкого уровня" при написании программ (на любом языке, высокого ли уровня или нет - не важно)?
И, конечно же, написанный и откомпилированный сейчас код "на языке высокого уровня" никогда не нарвётся на то, что обрабатываемые им данные существенно изменились?
Умный дом? С автоапдейтящимися прошивками в железках, ога. Спасибо.
Через 5 лет, после смены таймзоны и апдейта прошивки под оную смену (например) - что будете делать (реальный случай - размер буфера под выдаваемой некоторой прошивкой текстовое представление времени оказался недостаточен при изменении наименования таймзоны, в результате - атака по переполнению стека и креш системы)? А что будет делать клиент, если автор программы "высокого уровня" в одном из контроллеров успел помереть?
Ах, ФИДО? См. bink plus и необходимость добавить 42 в одном месте в календарном расчёте в СТАНДАРТНОЙ библиотеке в 2000 году. Раскопано Киром Злобиным.
Runtime Error в паскалевских (дада, язык высокого уровня!) программах ДОС эпохе при запуске на достаточно быстрых процессорах.
Правда, зачем думать о низком уровне? Давайте писать на высоком и не думать вообще. :)
no subject
Date: 2016-04-05 11:34 am (UTC)Что касается Runtime Error 200 то это как раз проблема низкого уровня. Попала в комплект распространенного компилятора кривая ассемблерная библиотека с неудачно написанным кодом инициализации. Причем попала фактически в качестве учебного примера. Уровня совместимости с GW-Basic, которым при написании приличных программ пользоваться не следует. Возможно, поэтому борландовцы и не исправили вовремя - у них уже в 93-м был Turbo Vision, которым и рекомендовалось пользоваться ВМЕСТО Crt.
Существуют альтернативные библиотеки tpcrt и opcrt (из комплекта Turbo Professional и Object Professional соответственно), где этой проблемы нет. Я еще году в 95-м, когда Турбо Паскаль был основным моим рабочим языком, писал в юзнете что модуль CRT вреден и использование его - признак чайника.
no subject
Date: 2016-04-05 12:34 pm (UTC)И потому выбирает "сердцем". :)
А клиент потом вынужден отказываться от применения откомпилированной таким образом программы. Или искать к ней патч ещё более низкого уровня (hiew/...), чем ассемблер.
Собственно - так и пришлось в 2000 году патчить кусочек сишной библиотеки в bink+.
no subject
Date: 2016-04-05 12:18 pm (UTC)>То есть НЕ СЛЕДУЕТ ВООБЩЕ употреблять "данных низкого уровня" и обрабтку "низкого уровня" при написании программ (на любом языке, высокого ли уровня или нет - не важно)?
Где я это сказал ?
Я просил привести пример оправданного прменения булевой арифметики в современной программе.
> Умный дом? С автоапдейтящимися прошивками в железках, ога. Спасибо. Через 5 лет, после смены таймзоны и апдейта прошивки под оную смену (например) - что будете делать (реальный случай - размер буфера под выдаваемой некоторой прошивкой текстовое представление времени оказался недостаточен при изменении наименования таймзоны, в результате - атака по переполнению стека и креш системы)? А что будет делать клиент, если автор программы "высокого уровня" в одном из контроллеров успел помереть?
В моем случае, клиент будет лежать в гробу, глубоко безразличный к проблеме, тк умный дом он строит для себя сам. :-)
В стандартном - свяжется с саппортом, или (если это будет очень умный клиент :-) соберет нужную прошивку сам из открытых исходников.
Вообще, мне кажется, термин прошивка не совсем применим к современным устройствам. Правильнее говорить про ОС и прикладной софт. Соответственно, нормальный процесс исправления ошибок в прикладном софте. Как вариант - зайти на контроллер ssh-м и обновить соответствующий пакет.
Но как это все связано с изначальным разговором про булеву арифметику, мне не очень понятно.
> Правда, зачем думать о низком уровне? Давайте писать на высоком и не думать вообще. :)
Ну, как бы, да. Мир к тому идет. В частности, Вашими усилиями. Нет ?
no subject
Date: 2016-04-05 12:38 pm (UTC)Почти любая реализация видеокодеков.
Содержательная обработка данных с конкретного железа.
При соответствующе документированном протоколе.
no subject
Date: 2016-04-05 12:41 pm (UTC)По дороге сам вспомнил про криптографию :-)
no subject
Date: 2016-04-05 03:10 pm (UTC)Компактные сетевые протоколы с быстрым парсингом, кстати. Типа CBOR. Она там примитивная, но есть, и обеспечивает компактность.
Когда данных надо передать МНОГО, компактность протокола ой, важна...
no subject
Date: 2016-04-05 03:33 pm (UTC)AreaLink[area_off] |= here_mask1;
AreaLink[area_off] &= here_mask0;
area_off - понятное дело, адрес байта. :)
no subject
Date: 2016-04-05 03:30 pm (UTC)И, кстати, конкретно эта засада единственно правильным способом не засажена в языке Ада (да-да, том самом): там есть ДВЕ операции `mod` и `rem`. Если их две, то ты невольно задумаешься, какая именно из них нужна. А если у тебя только `%`, который совпадает с одной из них, причём не с той -- вопрос имеет куда более высокие шансы быть проигнорированным.
... Маркс, Кейнс и кот Матроскин ...