ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Закрытая тема
 
Опции темы Поиск в этой теме Опции просмотра

Программа на С(нет ошибки переполнения)
  #1  
Старый 04.01.2007, 22:17
Tikson
Постоянный
Регистрация: 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.. Причина: исправил ошибки
 

  #2  
Старый 04.01.2007, 22:32
_Great_
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме:
5339610

Репутация: 4360


Отправить сообщение для _Great_ с помощью ICQ
По умолчанию

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

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

  #4  
Старый 04.01.2007, 23:36
Tikson
Постоянный
Регистрация: 09.10.2005
Сообщений: 333
Провел на форуме:
1387660

Репутация: 74
По умолчанию

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

  #5  
Старый 05.01.2007, 00:11
_Great_
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме:
5339610

Репутация: 4360


Отправить сообщение для _Great_ с помощью ICQ
По умолчанию

Попробуй запусти ее в отладчике и введи 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
 

  #6  
Старый 05.01.2007, 00:57
Zadoxlik
Постоянный
Регистрация: 28.02.2005
Сообщений: 853
Провел на форуме:
3369632

Репутация: 749


По умолчанию

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

  #7  
Старый 05.01.2007, 01:19
Zadoxlik
Постоянный
Регистрация: 28.02.2005
Сообщений: 853
Провел на форуме:
3369632

Репутация: 749


По умолчанию

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

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

  #8  
Старый 05.01.2007, 01:35
_Great_
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме:
5339610

Репутация: 4360


Отправить сообщение для _Great_ с помощью ICQ
По умолчанию

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

  #9  
Старый 05.01.2007, 15:37
Zadoxlik
Постоянный
Регистрация: 28.02.2005
Сообщений: 853
Провел на форуме:
3369632

Репутация: 749


По умолчанию

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

  #10  
Старый 05.01.2007, 16:02
_Great_
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме:
5339610

Репутация: 4360


Отправить сообщение для _Great_ с помощью ICQ
По умолчанию

туплю %)
 
Закрытая тема



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Софт для мобильных телефонов под *nix Grrl Сотовый фрикинг 2 02.03.2007 01:47
Bsod экран смерти silveran Чужие Статьи 1 21.12.2005 22:34
ПРОГРАММА "АНТИБАН" Киллер АнтиАдмин 7 09.04.2005 12:00
Допустим программа работает... =))) PEPSICOLA С/С++, C#, Delphi, .NET, Asm 8 15.02.2005 06:21
программа снуффер shmv Болталка 5 12.02.2003 18:09



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ