Sat Sep 12 2009 14:54, Nickita A Startcev wrote to Kirill Frolov:
KF>> килограммы, а не граммы, в скорости метры в секунду, а не километры в KF>> час и т.п. Это действительно полезно, иначе когда используется для KF>> одного и того же много размерностей легко наделать ошибок. NAS> Полезно, но я такого ни разу не видел.
У Джоеля описано, если не ошибаюсь, откуда пошло.
NAS> Кстати, интересно было бы посмотреть на язык/компилятор/либу, которые бы NAS> били по башке за попытку складывания граммов с килограммами.
C++. Можно даже сделать корректное выполнение операций над тем и другим вперемешку. Как -- думаю очевидно. Да многие языки с нативной поддержкой ООП, другое дело, что далеко не все позволят это делать в арифметических выражениях.
NAS>>> В моих задачах полезнее видеть размер переменной и знаковость. NAS>>> Что-где-как искать обычно по контексту видно.
KF>> Потому беззнаковость имеет очень узкое применение: только там где KF>> она критична (uint8_t, 8-битные контроллеры где в int ничего не лезет KF>> и знаковое сравнение чисел заметно тяжелее...) NAS> либо жесткий реалтайм, где мы чуток экономим, урезав разрядность.
Типовой пример -- звук. Если он беззнаковый -- любые расчёты приводят к необходимости выделения отдельно знака, отдельно абсолютного значения, всё врукопашную -- оно надо? Кстати надо (я писал -- узкое применение). Вручную те же умножения, врукопашную выделив знак и приведя к unsigned, выполняются быстрей, чем если тупо перемножать знаковые да и ещё целые. Да, на 8-бит контроллере:
static sample_t sound_adjvol(sample_t v) { int_fast8_t sign; sign = (v<0); if (sign) v=-v; v = (unsigned)((uint_fast8_t)((v>>8)&0xff)*snd_vol) + (uint_fast8_t)((unsigned)((uint_fast8_t)(v&0xff)*snd_vol)>>8); if (sign) v=-v; return v; }
Hо это -- ОПТИМИЗАЦИЯ. По скорости, ибо >10000 раз/сек. Выполнялось после внимательного изучения листингов и подсчёта тактов. А оригинал был тривиален: return ((long)v*snd_vol)>>8; Замечу особо -- sample_t, несмотря на, везде знаковый.
NAS> А с переполнением в сях вообще всё плохо и лечится почти только
В каком-нибудь перле -- то же самое. И что характерно, многие языки с динамической типизацией (хотя бы тройка perl, tcl, python) по-умолчанию подразумевают int, ну или double, если в int не влезает. Иногда другие типы (длинные целые, рациональные числа). Hасильно получить unsigned возможности я что-то вовсе неприпоминаю. Эта неспроста...
NAS> расширением разрядности до избыточной. ну, или, порнографией типа NAS> if((a+b)<b)
Hет, мы исходим из того, что тип программист выбирал всё-таки такой, что туда гарантированно всё помещается. Просто человек, владея алгебраической логикой, может запросто что-то переставить в выражении, с левой части в правую и т.п., и всё математически останется корректно, и потому не скажешь сразу мол ошибка. А там отрицательная величина -- далее понятно.
[ZX]