3

Вопрос по c++ – С ++ переполнение и переполнение

Привет, я новичок здесь, поэтому, пожалуйста, дайте мне знать, если что-то не так, и я постараюсь улучшить в следующий раз.

Я пытаюсь понять, как происходит переполнение и переполнение в C ++. Я понимаю, что если диапазон переменной будет превышен, он начнется с другого конца диапазона. Таким образом, если минимум короткого замыкания равен -32768, и если мы введем -1, новое значение должно быть SHRT_MAX. (32767) Вот мой код:

#include<iostream.h>
#include<limits.h>
#include<conio.h>
int main ( void )
{
 int testpositive =INT_MIN ;
 short testnegative = SHRT_MIN ; 
 cout<< SHRT_MIN<<"\n";
 cout << testnegative-1<<"\n";
 cout << INT_MIN << "\n";
 cout << testpositive-1 << "\n"; 
 cout<<testpositive-2;
 getch();
 return 0;
}   
  • @ouah: Да ... добавлено примечание о допущениях, которые компиляторы могут делать бесплатно при анализе кода

    от
  • Дело в том, что современные компиляторы используют преимущества переполнения со знаком как неопределенное поведение для выполнения оптимизаций. Таким образом, даже если на уровне ЦП поведение определено, это не гарантирует, что ваша программа не вызывает неопределенное поведение.

    от
  • signed переполнение - неопределенное поведение

    от
  • Поведение не определено. Программа может очень хорошо вылетать.

    от
  • Рассмотреть возможность использования#include <iostream> вместо#include <iostream.h>.

    от L. F.
  • Операнды повышены доint во-первых, переполнения нет. Подумайте об уменьшении результата, чтобы увидеть, на что вы надеетесь.

    от Hans Passant
  • Удивительно. Это работает, и теперь я понимаю.

    от Knownow
  • 1

    Новое значение не должно быть

    SHRT_MAX это не определено.

  • 1

    Переполнения со знаком являются неопределенным поведением в C ++.

    Например:

    INT_MIN - 1

    -INT_MIN

    являются выражениями, которые вызывают неопределенное поведение.

    SHRT_MIN - 1 а также-SHRT_MIN не неопределенное поведение в среде с 16-битнымshort и 32-битныйint потому что с целочисленными продвижениями операнд повышается доint первый. В среде с 16-битнымshort а такжеintэти выражения также являются неопределенным поведением.

  • 2

    Типично да. Но так как это C ++

    а C ++ регулируется стандартом C ++, вы должны знать, что переполненияundefined behavior.

    Хотя то, что вы указали, вероятно, применимо к большинству платформ, это никоим образом не гарантировано, поэтому не полагайтесь на это.

  • 6

    Точное поведение при переполнении / недостаточности указано только для

    unsigned типы. Вместо обычных целочисленных типов со знаком стандарт C ++ просто говорит, что все может произойти.

    Если мы говорим о процессоре x86 (или о большинстве других современных процессоров), то на самом деле это именно то, что вы описываете, и для CPU нет разницы между значением со знаком или без знака (есть знаковое и беззнаковоеoperations, но сами значения всего лишь биты).

    Обратите внимание, что компиляторы могут предполагать (а большинство современных компиляторов-оптимизаторов действительно ДОЛЖНЫ предполагать), что целочисленное переполнение со знаком не может произойти в правильной программе и, например, в коде, подобном следующему:

    int x = foo();
    int y = x + 1;
    if (x < y) {
        do_something();
    } else {
        do_something_else();
    }
    

    компилятор может пропустить тест, аelse ветвь в сгенерированном коде полностью, потому что в действительной программе подписанный intx всегда меньше чемx+1 (поскольку подписанное переполнение не может считаться допустимым поведением). Если вы заменитеint сunsigned int однако компилятор должен генерировать код для теста и для ветви else, потому что для неподписанных типов возможно, чтоx > x+1.