Я ищу удобную идиому, чтобы проверить, умножение двух подписанных целых чисел (
s или long long s) переполнены, поскольку подписанный арифметический переполнение является неопределенным поведением в C и C ++. Я в порядке, используя любые библиотечные функции, доступные в C ++ 17, но в идеальном мире хотелось бы что -то более дешевое, чем Integer Division (например, проверка b = std :: numeric_limits :: mond ()/а или код в код> или код, с кодовой, с кодом> или кодовой. аргументы). В идеальном мире решение было бы чем-то, что компилятор мог бы оптимизировать (так же, как и вручную не выполнять размножение по одному слову за раз). < /P>
Я хотел бы избежать любых идиом, которые сначала выполняют умение, а затем проверка в здравомыслие, потому что компилятор может удалить проверку в области здравоохранения на основе предположения о том, что подписанная аритметика не может переполняться. (В конце концов, переполнение было бы неопределенным поведением, поэтому компилятор может предположить, что программист никогда не позволит этому случиться.) К сожалению, большинство алгоритмов, которые я видел, предложены в этой форме, поэтому кажутся небезопасными.
Подробнее здесь:
https://stackoverflow.com/questions/775 ... low-in-c17