какие-либо так.

кто-нибудь предоставить некоторые примеры кода, которые действуют по-разному при компиляции с fwrapv против.

В нем говорится, что -fwrapv должен «предполагать, что знаковое арифметическое переполнение сложения, вычитания и умножения заключает в оболочку использование представления с двумя дополнениями».

Но всякий раз, когда я пытаюсь переполнить, результат один и тот же с или без fwrapv.

 R..11 нояб. 2017 г., 01:21
@WeatherVane: вопрос о-fwrapv не-ftrapv.
 ktal11 нояб. 2017 г., 01:14
 Weather Vane11 нояб. 2017 г., 01:21
Он не говорит, что подписанные переполнения переносятся, он говорит: «-ftrapv Эта опция генерирует ловушки для подписанного переполнения при сложении, вычитании, операциях умножения».
 Weather Vane11 нояб. 2017 г., 01:10
Арифметическое переполнение со знаком - неопределенное поведение, так как-fwrapv переопределить стандарт C? "Это говорит ..."что говорит?
 Ethan18 июн. 2018 г., 06:10
@WeatherVane да, это расширение компилятора, которое переопределяет стандарт. Это называется расширением по причине.

Ответы на вопрос(1)

Подумайте об этой функции:

int f(int i) {
    return i+1 > i;
}

Математически говоря,i+1 всегда должен быть больше чемi для любого целого числаi, Однако для 32-битнойintесть одно значениеi что делает это утверждение ложным, что2147483647 (Т.е.0x7FFFFFFFт.е.INT_MAX). Добавление одного к этому числу вызовет переполнение, и новое значение, согласно представлению комплимента 2, будетукручения и стать-2147483648, Следовательно,i+1>1 становится-2147483648>2147483647 что неверно

Когда вы компилируетебез-fwrapvкомпилятор предположит, что переполнение является «неупакованным», иоптимизировать эту функцию, чтобы всегда возвращать1 (игнорируя случай переполнения).

Когда вы компилируетес участием-fwrapvфункция будетне быть оптимизированными он будет иметь логику добавления 1 и сравнения двух значений, потому что теперь переполнение является «переносом» (то есть переполненное число будет переноситься в соответствии с представлением комплимента 2).

 Aziz11 нояб. 2017 г., 01:45
@ktal Я предполагаю, что оптимизация компилятора включена (я использовал-O3).Вот сравнение двух скомпилированных кодов
 ktal11 нояб. 2017 г., 01:40
Я передал INT_MIN в вашу функцию и скомпилировал без fwrapv и получил 0. Код ассемблера, похоже, также указывает на то, что даже без опции fwrapv компилятор все еще проверяет переполнение на основе вывода сборки. movl% edi, -4 (% rbp) movl -4 (% rbp),% eax addl $ 1,% eax cmpl% eax, -4 (% rbp) setl% al movzbl% al,% eax Мы предполагаем -O2?
 R..11 нояб. 2017 г., 02:05
Если это было вызвано с константойINT_MAX а не переменная, значение которой компилятор не может видеть, также возможно, что функция была встроена и подвергнута постоянному распространению до крахаi+1>i в true, и в этом случае он мог бы быть оценен как false.

Ваш ответ на вопрос