Почему не возникает ошибка переполнения, при введении числа больше 32767 или меньше -32767 , при испольновании переменной типа int, хотя она должна возникать ?
Попробуй запусти ее в отладчике и введи 5000000000000. Ты увидишь, что записывается в переменную верхний предел для значений типа int: 2147483647. Переполнения не происходит по простой причине: оператор cin>>int_var "знает" размер переменной и не запишет в нее больше, чем она вмещает. Переполнение возникает тогда, когда функция "не знает" размера буфера и случайно записывает больше, чем он вмещает. Пример: Code: void main() { char local_buffer[10]; gets(local_buffer); return 0; } gets() не знает размер буфера (он просто-напросто ей не передается), поэтому она записывает туда вслепую - авось, да поместится. А попробуй введи строчку длиннее 10 символов, например, ййййййййййййййййййййййййй. Буфер переполнится и инструкция return 0 вылетит с Access Violation. Совет - читай мою статью про переполнение буфера: https://forum.antichat.ru/thread26791.html
Не возникает, потому что 32767 - это максимальное знаковое int для 16битных систем. У тебя книга старая. Щас уже во всю у всех 32битные процы и соответствующие компиляторы. Не говорю уже о том, что многие пересаживаютчя на 64битные. В твоем случае (32 bit) переполнение наверно произойдет после 2147483647 (0x7FFFFFFF), дальнейшее увеличение числа приведет к появлению 1цы в знаковом разряде, что и называется переполнением
не , не происходит, ввожу 999999999999999999999999 и всеравно печатает посоветуйте новую , с сылкой если можно на скачку =)
Tikson не путай "ошибку переполнения" т.е "превышение диапазона значений переменной" с bof. Она и возникает - выводит неправильное значение. Почему? Пример: Code: #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 что и выводится на экран
bof = buffer overflow = переполнение буфера =) И может случиться оно и до тех пор, когда биты вылезут за разрядную сетку, занимаемую переменной в памяти =Р Если тип signed
это произойдет еще на этапе компиляции, причем умный компилер даже выдаст ворнинг о превышении даипазона значений. никогда не получится запихнуть, например, в 2-х байтовую переменную три байта, поэтому переполнения буфера не будет никогда. Просто в переменную запишется другое, урезанное значение.
естественно =Ь Но ситуация когда в переменную пытаются записать значение б0льшее чем она может вместить тоже называется переполнением. Происходить может на операционном устройстве, тогда будет передано сообщение в виде установленного флага CF или на этапе компиляции, тогда об этом любезно скажет компилятор
Да а еще может происходить просто при записи данных в память, выделенную под переменную, тогда об этом никто не скажет =) Как в примере автора темы