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

3

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

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

<code>#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;
}   
</code>
Рассмотреть возможность использования#include <iostream> вместо#include <iostream.h>. L. F.
Удивительно. Это работает, и теперь я понимаю. Knownow
Операнды повышены доint во-первых, переполнения нет. Подумайте об уменьшении результата, чтобы увидеть, на что вы надеетесь. Hans Passant

Ваш Ответ

4   ответа
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.

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

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

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

signed переполнение - неопределенное поведение
1

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

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

Например:

INT_MIN - 1

-INT_MIN

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

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

Похожие вопросы