История изменений
Исправление wandrien, (текущая версия) :
И если вдруг шаблон разворачивается в a+b-b, то нельзя заменять на a, надо вычислять сумму и проверять на переполнение.
Почему нельзя? В Си и Си++ не гарантирован порядок вычислений внутри арифметического выражения. При вычислении a+(b-b)
никакого переполнения нет.
Более того, смысл переполнения в том, что результат вычисления выходит за рамки представимого диапазона. А результат вычисления a+b-b
заведомо лежит в диапазоне типа переменной a
при любом b
.
Поэтому в выражении (a+b)*c*2+3
может содержаться от 4 до 0 проверок, в зависимости от того, что именно компилятор знает о диапазонах значений, которые могут принимать эти переменные.
Например, если c
заведомо содержит 0 в старшем значащем разряде, то одну проверку можно устранить.
Исходная версия wandrien, :
И если вдруг шаблон разворачивается в a+b-b, то нельзя заменять на a, надо вычислять сумму и проверять на переполнение.
Почему нельзя? В Си и Си++ не гарантирован порядок вычислений внутри арифметического выражения. При вычислении a+(b-b)
никакого переполнения нет.
Более того, смысл переполнения в том, что результат вычисления выходит за рамки представимого диапазона. А результат вычисления a+b-b
заведомо лежит в диапазоне типа переменной a
при любом b
.
Поэтому в выражении (a+b)*c*2+3
может содержаться от 4 до 0 проверок, в зависимости от того, что именно компилятор знает о диапазонах значений, которые могут принимать эти переменные.
Например, если c
заведомо содержит 0 в старшем значащем разряде, то одно проверку можно устранить.