LINUX.ORG.RU

История изменений

Исправление 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 в старшем значащем разряде, то одно проверку можно устранить.