Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|
Программа на С(нет ошибки переполнения) |

04.01.2007, 22:17
|
|
Постоянный
Регистрация: 09.10.2005
Сообщений: 333
Провел на форуме: 1387660
Репутация:
74
|
|
Программа на С(нет ошибки переполнения)
Почему не возникает ошибка переполнения, при введении числа больше 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 << ' ';
}
Последний раз редактировалось Tikson; 04.01.2007 в 23:11..
Причина: исправил ошибки
|
|
|

04.01.2007, 22:32
|
|
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме: 5339610
Репутация:
4360
|
|
int, потя она должна возникать ?
о, ужас, кто тебе это сказал?
нифига она не должна возникать
|
|
|

04.01.2007, 22:50
|
|
Постоянный
Регистрация: 09.10.2005
Сообщений: 333
Провел на форуме: 1387660
Репутация:
74
|
|
выдержка из книги, может это я что-то неправильно понял...
Следующая программа 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, то переполнение приводит к отрицательному значению, которое предотвращает выполнение цикла.
а что должно тогда происходить?
|
|
|

04.01.2007, 23:36
|
|
Постоянный
Регистрация: 09.10.2005
Сообщений: 333
Провел на форуме: 1387660
Репутация:
74
|
|
_Great_
я совсем глупый вопрос задал? =)
хоят там же написано...
Например, запустите программу и введите значение 50000. Поскольку это значение превышает наибольшее возможное для переменной типа int, то переполнение приводит к отрицательному значению, которое предотвращает выполнение цикла.
|
|
|

05.01.2007, 00:11
|
|
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме: 5339610
Репутация:
4360
|
|
Попробуй запусти ее в отладчике и введи 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
|
|
|

05.01.2007, 00:57
|
|
Постоянный
Регистрация: 28.02.2005
Сообщений: 853
Провел на форуме: 3369632
Репутация:
749
|
|
Тут имеется ввиду переполнение в знаковом разряде
|
|
|

05.01.2007, 01:19
|
|
Постоянный
Регистрация: 28.02.2005
Сообщений: 853
Провел на форуме: 3369632
Репутация:
749
|
|
Не возникает, потому что 32767 - это максимальное знаковое int для 16битных систем. У тебя книга старая. Щас уже во всю у всех 32битные процы и соответствующие компиляторы. Не говорю уже о том, что многие пересаживаютчя на 64битные.
В твоем случае (32 bit) переполнение наверно произойдет после 2147483647 (0x7FFFFFFF), дальнейшее увеличение числа приведет к появлению 1цы в знаковом разряде, что и называется переполнением 
|
|
|

05.01.2007, 01:35
|
|
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме: 5339610
Репутация:
4360
|
|
Аааа, если имеется в виду флаг Cf, тогда да.
|
|
|

05.01.2007, 15:37
|
|
Постоянный
Регистрация: 28.02.2005
Сообщений: 853
Провел на форуме: 3369632
Репутация:
749
|
|
Арифметических операций никаких не выполняется, поэтому флаг Cf тут непричем =Ь
|
|
|

05.01.2007, 16:02
|
|
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме: 5339610
Репутация:
4360
|
|
туплю %)
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|