ulidtko 22.07.2012 11:23 уважением

Придумалась задачка тут.
Скажем, складываем мы два инта. Как проверить, случилось ли переполнение?
Подразумевается язык, хоть немного абстрагированный от конкретной архитектуры; то есть, Си как минимум. В x86 у нас есть Carry Flag и jc. А в сях?

Что-то мне ничего элегантного в голову не приходит. Либо я тупой, либо АГА ВОТ-ТУТ ТО СИЕБКИ И СОСНУЛИ ПОРТАБЕЛЬНОГО ХУЙЦА ТОЛЬКО АССЕМБЛЕР ТОЛЬКО ХАРДКОР.

dev
Recommended by: @0xd34df00d
1. gelraen 22.07.2012 11:25

сумма меньше одного из слагаемых — переполнение

2. gelraengelraen /1 22.07.2012 11:25

хотя это тоже ненадёжно, ибо integer overflow — UB, емнип

3. ulidtkogelraen /2 22.07.2012 11:26 уважением

nope, только signed

4. ulidtkogelraen /1 22.07.2012 11:26 уважением

целых два сравнения и две проверки VS тыкнуть один флаг сразу после сложения
НАХУЙ ТАК ЖИТЬ

5. ulidtkogelraen /2 22.07.2012 11:27 уважением

беззнаковый оверфлоу определён, стандарт гарантирует INT_MAX + 1 == 0.

6. gelraenulidtko /4 22.07.2012 11:28 imax

нуэ, тащемта сумма после переполнения будет меньше обоих слагаемых, так что можно делать только одно сравнение. Это если при переполнении просто срезается старший бит, который не поместился.

7. DZhon 22.07.2012 11:29

Who cares about carry flags ?

8. ulidtkoDZhon /7 22.07.2012 11:30 уважением

ну не скажи, integer overflow — довольно-таки exploitable.

9. DZhonulidtko /8 22.07.2012 11:32

Это hardware-specific ;)

10. gelraenulidtko /4 22.07.2012 11:33 imax

если тебя волнует производительность в этом плане — перепиши нужный кусочек на асме, делов-то

11. ulidtkoDZhon /9 22.07.2012 11:33 уважением

дооо, давайте всё неудобное валить на железячников!
они умные, разберутся.

12. ulidtkogelraen /10 22.07.2012 11:34 уважением

меня волнует протечка абстракции в данном случае. Казалось бы, вот он — высокоуровневый портабельный ассемблер... а вот хуй.

13. gelraenulidtko /12 22.07.2012 11:39 imax

а в чём непортабельность-то?

14. ulidtkoDZhon /7 22.07.2012 11:39

кстати да, со свадьбой тебя :3

15. ulidtkogelraen /13 22.07.2012 11:40 уважением

> перепиши нужный кусочек на асме
> непортабельность

16. gelraenulidtko /15 22.07.2012 11:41 imax

так тебе производительность или портабельность? емнип, на некоторых архитектурах целочисленное переполнение приводит к trap'у, так что я не понимаю о чём ты говоришь.

17. DZhonulidtko /14 22.07.2012 11:51

Спасибо! :)

18. DZhonulidtko /11 22.07.2012 11:52

Так или иначе, в многочисленных срачах на стэковерфлоу решили, что это делается через инлайн-ассемблер, тут все и заканчивается.

19. DZhongelraen /16 22.07.2012 11:54

FPE_INTOVF_TRAP Integer overflow (impossible in a C program unless you enable overflow trapping in a hardware-specific fashion). (c) Glibc manual

20. 238328 22.07.2012 16:03

не прошли и 30 лет

21. ulidtkogelraen /16 12.10.2012 18:25

в общем, итог: одновременно максимально производительно И портабельно /0 не решается [в сишечке].

Единственный как бы выход — надеяться на умный, угадывающий желания, компилятор. Которого у нас по-видимому нет, и с такой-то сложностью языка, скорее всего, не будет.

Do you really want to delete ?