Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Программа на С(нет ошибки переполнения) (https://forum.antichat.xyz/showthread.php?t=30576)

Tikson 04.01.2007 22:17

Программа на С(нет ошибки переполнения)
 
Почему не возникает ошибка переполнения, при введении числа больше 32767 или меньше -32767 , при испольновании переменной типа int, хотя она должна возникать ?


Цитата:

#include <iostream.h>
void main(void)

{
int count;
int ending_value;
cout << "Введите конечное значение и нажмите Enter: ";
cin >> ending_value;
for (count = 0; count <= ending_value; count++)
cout << count << ' ';
}

_Great_ 04.01.2007 22:32

Цитата:

int, потя она должна возникать ?
о, ужас, кто тебе это сказал?
нифига она не должна возникать

Tikson 04.01.2007 22:50

выдержка из книги, может это я что-то неправильно понял...
Цитата:

Следующая программа ASKCOUNT.CPP выводит сообщение, запрашивающее пользователя ввести число, при котором цикл должен завершиться. Затем программа выводит числа от одного до указанного значения:

#include <iostream.h>

void main(void)

{
int count;
int ending_value;
cout << "Введите конечное значение и нажмите Enter: ";
cin >> ending_value;
for (count = 0; count <= ending_value; count++)
cout << count << ' ';
}

Экспериментируйте с этой программой, вводя разные числа, например 10, 1 и даже 0. Если вы вводите значение 0 или 1, цикл for никогда не выполняется, потому что условие count <= ending_value сразу же ложно. Помните, если вы введете значение вне диапазона значений, которые может хранить переменная типа int, возникнет ошибка переполнения. Например, запустите программу и введите значение 50000. Поскольку это значение превышает наибольшее возможное для переменной типа int, то переполнение приводит к отрицательному значению, которое предотвращает выполнение цикла.
а что должно тогда происходить?

Tikson 04.01.2007 23:36

_Great_
я совсем глупый вопрос задал? =)
хоят там же написано...
Цитата:

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

_Great_ 05.01.2007 00:11

Попробуй запусти ее в отладчике и введи 5000000000000.
Ты увидишь, что записывается в переменную верхний предел для значений типа int: 2147483647. Переполнения не происходит по простой причине: оператор cin>>int_var "знает" размер переменной и не запишет в нее больше, чем она вмещает.
Переполнение возникает тогда, когда функция "не знает" размера буфера и случайно записывает больше, чем он вмещает.
Пример:

Код:

void main()
{
  char local_buffer[10];
  gets(local_buffer);
  return 0;
}

gets() не знает размер буфера (он просто-напросто ей не передается), поэтому она записывает туда вслепую - авось, да поместится. А попробуй введи строчку длиннее 10 символов, например, ййййййййййййййййййййййййй . Буфер переполнится и инструкция return 0 вылетит с Access Violation.

Совет - читай мою статью про переполнение буфера:
https://forum.antichat.ru/thread26791.html

Zadoxlik 05.01.2007 00:57

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

Zadoxlik 05.01.2007 01:19

Не возникает, потому что 32767 - это максимальное знаковое int для 16битных систем. У тебя книга старая. Щас уже во всю у всех 32битные процы и соответствующие компиляторы. Не говорю уже о том, что многие пересаживаютчя на 64битные.

В твоем случае (32 bit) переполнение наверно произойдет после 2147483647 (0x7FFFFFFF), дальнейшее увеличение числа приведет к появлению 1цы в знаковом разряде, что и называется переполнением ;)

_Great_ 05.01.2007 01:35

Аааа, если имеется в виду флаг Cf, тогда да.

Zadoxlik 05.01.2007 15:37

Арифметических операций никаких не выполняется, поэтому флаг Cf тут непричем =Ь

_Great_ 05.01.2007 16:02

туплю %)


Время: 05:27