При оптимизации, GCC иногда говорит мнеПочему может произойти переполнение подписей при смене деления на сдвиг вправо?
предполагая, подписанное переполнение не происходит при упрощении
/
или%
к>>
или&
[-Wstrict-overflow
]
я не смог сделать воспроизводимый тест-случай для этого, но в моем производственном коде есть что-то вроде
int left = a.left() + (a.width() - b.width())/2;
, где все методы возвращают значения int
.
Почему может замена компилятора из /2
с >>1
или (например) %4
с &3
приводят к целому перелива?
>> на целых знаках, зависящих от реализации. См.: Http://stackoverflow.com/questions/11644362/are-the-results-of-bitwise-operations-on-signed-integers-defined – virgesmith
Я думаю, что неправильно понял предупреждение, что результат может быть ** неопределенным **. Но это просто говорит нам о том, что это ** определено реализацией **. Это не так уж плохо - но все же полезно быть предупрежденным. –
Обратите внимание, что это отличается от * программиста *, заменяя '/' на '>>', например, поскольку компилятор должен знать, для чего он предназначен. –