![]() |
Программа на С(нет ошибки переполнения)
Почему не возникает ошибка переполнения, при введении числа больше 32767 или меньше -32767 , при испольновании переменной типа int, хотя она должна возникать ?
Цитата:
|
Цитата:
нифига она не должна возникать |
выдержка из книги, может это я что-то неправильно понял...
Цитата:
|
_Great_
я совсем глупый вопрос задал? =) хоят там же написано... Цитата:
|
Попробуй запусти ее в отладчике и введи 5000000000000.
Ты увидишь, что записывается в переменную верхний предел для значений типа int: 2147483647. Переполнения не происходит по простой причине: оператор cin>>int_var "знает" размер переменной и не запишет в нее больше, чем она вмещает. Переполнение возникает тогда, когда функция "не знает" размера буфера и случайно записывает больше, чем он вмещает. Пример: Код:
void main()Совет - читай мою статью про переполнение буфера: https://forum.antichat.ru/thread26791.html |
Тут имеется ввиду переполнение в знаковом разряде
|
Не возникает, потому что 32767 - это максимальное знаковое int для 16битных систем. У тебя книга старая. Щас уже во всю у всех 32битные процы и соответствующие компиляторы. Не говорю уже о том, что многие пересаживаютчя на 64битные.
В твоем случае (32 bit) переполнение наверно произойдет после 2147483647 (0x7FFFFFFF), дальнейшее увеличение числа приведет к появлению 1цы в знаковом разряде, что и называется переполнением ;) |
Аааа, если имеется в виду флаг Cf, тогда да.
|
Арифметических операций никаких не выполняется, поэтому флаг Cf тут непричем =Ь
|
туплю %)
|
Цитата:
Цитата:
|
А ты введи 2147483648 =)
|
Tikson не путай "ошибку переполнения" т.е "превышение диапазона значений переменной" с bof.
Цитата:
Код:
#include <iostream> Так вот: 101111101011110000011111111(bin) = 99999999(dec) Дабы вместить значение в 2хбайтовую переменную, то что отмечено красным отбрасывается - вот и все. Остается: 1110000011111111(bin) = 57599 что и выводится на экран :) |
bof = buffer overflow = переполнение буфера =) И может случиться оно и до тех пор, когда биты вылезут за разрядную сетку, занимаемую переменной в памяти =Р Если тип signed
|
Zadoxlik - примером не порадуешь? А то у меня твой пост в голове не укладывается =)
|
Пример приведен топикстартером =)
|
Цитата:
Цитата:
|
Цитата:
|
Цитата:
|
Да а еще может происходить просто при записи данных в память, выделенную под переменную, тогда об этом никто не скажет =) Как в примере автора темы
|
В примере автора ничего плохого не случится. Просто запишется максимальное число, если введут число, большее максимально допустимого для переменной.
Гораздо страшнее, если будет чето-нить в роде gets(local_buffer) |
не максимальное только, оно потом в минус уйдет неожиданно
|
Цитата:
вполне ожиданно, потому что установится самый старший знаковый бит числа, если число со знаком, конечно. то есть для short это будет -32768 (кажется ;)), а для unsigned short: 65536 |
А кто тебе сказал что она должна вылетать?
Вообщем как всегда обсуждение хочешь свести к русскому языку, хотя я и счетаю что ты здесь неправ, продолжать обсуждения смысла не вижу, т.к. оно никакой пользы ни для кого дальше не имеет |
Как всегда разговор идет о разных вещах
|
ОК .. тему закрываю.
|
| Время: 11:32 |