ulidtko
22.07.2012 11:23 уважением
Придумалась задачка тут.
Скажем, складываем мы два инта. Как проверить, случилось ли переполнение?
Подразумевается язык, хоть немного абстрагированный от конкретной архитектуры; то есть, Си как минимум. В x86 у нас есть Carry Flag и jc. А в сях?
Что-то мне ничего элегантного в голову не приходит. Либо я тупой, либо АГА ВОТ-ТУТ ТО СИЕБКИ И СОСНУЛИ ПОРТАБЕЛЬНОГО ХУЙЦА ТОЛЬКО АССЕМБЛЕР ТОЛЬКО ХАРДКОР.
Recommended by:
@0xd34df00d
сумма меньше одного из слагаемых — переполнение
хотя это тоже ненадёжно, ибо integer overflow — UB, емнип
nope, только signed
целых два сравнения и две проверки VS тыкнуть один флаг сразу после сложения
НАХУЙ ТАК ЖИТЬ
беззнаковый оверфлоу определён, стандарт гарантирует INT_MAX + 1 == 0.
нуэ, тащемта сумма после переполнения будет меньше обоих слагаемых, так что можно делать только одно сравнение. Это если при переполнении просто срезается старший бит, который не поместился.
Who cares about carry flags ?
ну не скажи, integer overflow — довольно-таки exploitable.
Это hardware-specific ;)
если тебя волнует производительность в этом плане — перепиши нужный кусочек на асме, делов-то
дооо, давайте всё неудобное валить на железячников!
они умные, разберутся.
меня волнует протечка абстракции в данном случае. Казалось бы, вот он — высокоуровневый портабельный ассемблер... а вот хуй.
а в чём непортабельность-то?
кстати да, со свадьбой тебя :3
> перепиши нужный кусочек на асме
> непортабельность
так тебе производительность или портабельность? емнип, на некоторых архитектурах целочисленное переполнение приводит к trap'у, так что я не понимаю о чём ты говоришь.
Спасибо! :)
Так или иначе, в многочисленных срачах на стэковерфлоу решили, что это делается через инлайн-ассемблер, тут все и заканчивается.
FPE_INTOVF_TRAP Integer overflow (impossible in a C program unless you enable overflow trapping in a hardware-specific fashion). (c) Glibc manual
не прошли и 30 лет
в общем, итог: одновременно максимально производительно И портабельно /0 не решается [в сишечке].
Единственный как бы выход — надеяться на умный, угадывающий желания, компилятор. Которого у нас по-видимому нет, и с такой-то сложностью языка, скорее всего, не будет.