ANTICHAT Forum
HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
НОВЫЕ ТОРГОВАЯ НОВОСТИ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Закрытая тема
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 05.01.2007, 19:59
Tikson
Постоянный
Регистрация: 09.10.2005
Сообщений: 333
С нами: 10834946

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

Цитата:
В твоем случае (32 bit) переполнение наверно произойдет после 2147483647 (0x7FFFFFFF)
не , не происходит, ввожу 999999999999999999999999 и всеравно печатает
Цитата:
У тебя книга старая.
посоветуйте новую , с сылкой если можно на скачку =)
 

  #2  
Старый 05.01.2007, 20:35
Zadoxlik
Постоянный
Регистрация: 28.02.2005
Сообщений: 853
С нами: 11156006

Репутация: 749


По умолчанию

А ты введи 2147483648 =)
 

  #3  
Старый 05.01.2007, 21:49
Deem3n®
Постоянный
Регистрация: 19.09.2005
Сообщений: 408
С нами: 10863746

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

Tikson не путай "ошибку переполнения" т.е "превышение диапазона значений переменной" с bof.

Цитата:
Почему не возникает ошибка переполнения, при введении числа больше 32767 или меньше -32767 , при испольновании переменной типа int, хотя она должна возникать ?
Она и возникает - выводит неправильное значение. Почему? Пример:
Код:
#include <iostream> 
using namespace std;

main(void)

{
   unsigned short short_var = 99999999;
   cout << short_var << endl;
   
   return 1;
}
Допустим что у тебя 32битный проц -> у unsigned short 2 байта = 16 бит (0 - 65535).
Так вот:
101111101011110000011111111(bin) = 99999999(dec)
Дабы вместить значение в 2хбайтовую переменную, то что отмечено красным отбрасывается - вот и все. Остается:
1110000011111111(bin) = 57599
что и выводится на экран
 

  #4  
Старый 05.01.2007, 22:16
Zadoxlik
Постоянный
Регистрация: 28.02.2005
Сообщений: 853
С нами: 11156006

Репутация: 749


По умолчанию

bof = buffer overflow = переполнение буфера =) И может случиться оно и до тех пор, когда биты вылезут за разрядную сетку, занимаемую переменной в памяти =Р Если тип signed
 

  #5  
Старый 05.01.2007, 22:27
Deem3n®
Постоянный
Регистрация: 19.09.2005
Сообщений: 408
С нами: 10863746

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

Zadoxlik - примером не порадуешь? А то у меня твой пост в голове не укладывается =)
 

  #6  
Старый 05.01.2007, 22:29
Zadoxlik
Постоянный
Регистрация: 28.02.2005
Сообщений: 853
С нами: 11156006

Репутация: 749


По умолчанию

Пример приведен топикстартером =)
 

  #7  
Старый 05.01.2007, 22:34
_Great_
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
С нами: 10721066

Репутация: 4360


По умолчанию

Цитата:
Допустим что у тебя 32битный проц -> у unsigned short 2 байта = 16 бит (0 - 65535).
Так вот:
101111101011110000011111111(bin) = 99999999(dec)
Дабы вместить значение в 2хбайтовую переменную, то что отмечено красным отбрасывается - вот и все. Остается:
1110000011111111(bin) = 57599
что и выводится на экран
это произойдет еще на этапе компиляции, причем умный компилер даже выдаст ворнинг о превышении даипазона значений.

Цитата:
bof = buffer overflow = переполнение буфера =) И может случиться оно и до тех пор, когда биты вылезут за разрядную сетку, занимаемую переменной в памяти =Р Если тип signed
никогда не получится запихнуть, например, в 2-х байтовую переменную три байта, поэтому переполнения буфера не будет никогда. Просто в переменную запишется другое, урезанное значение.
 

  #8  
Старый 05.01.2007, 22:39
Zadoxlik
Постоянный
Регистрация: 28.02.2005
Сообщений: 853
С нами: 11156006

Репутация: 749


По умолчанию

Цитата:
никогда не получится запихнуть, например, в 2-х байтовую переменную три байта, поэтому переполнения буфера не будет никогда. Просто в переменную запишется другое, урезанное значение.
естественно =Ь Но ситуация когда в переменную пытаются записать значение б0льшее чем она может вместить тоже называется переполнением. Происходить может на операционном устройстве, тогда будет передано сообщение в виде установленного флага CF или на этапе компиляции, тогда об этом любезно скажет компилятор

Последний раз редактировалось Zadoxlik; 05.01.2007 в 22:42..
 

  #9  
Старый 05.01.2007, 22:42
_Great_
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
С нами: 10721066

Репутация: 4360


По умолчанию

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

  #10  
Старый 05.01.2007, 22:49
Zadoxlik
Постоянный
Регистрация: 28.02.2005
Сообщений: 853
С нами: 11156006

Репутация: 749


По умолчанию

Да а еще может происходить просто при записи данных в память, выделенную под переменную, тогда об этом никто не скажет =) Как в примере автора темы
 
Закрытая тема



Предыдущая тема Следующая тема
Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Допустим программа работает... =))) PEPSICOLA С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby 8 15.02.2005 06:21
программа снуффер shmv Болталка 5 12.02.2003 18:09



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


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




ANTICHAT ™ © 2001- Antichat Kft.