Программа на С(нет ошибки переполнения)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Tikson, 4 Jan 2007.

Thread Status:
Not open for further replies.
  1. Tikson

    Tikson Elder - Старейшина

    Joined:
    9 Oct 2005
    Messages:
    263
    Likes Received:
    42
    Reputations:
    14
    Почему не возникает ошибка переполнения, при введении числа больше 32767 или меньше -32767 , при испольновании переменной типа int, хотя она должна возникать ?


     
    #1 Tikson, 4 Jan 2007
    Last edited: 4 Jan 2007
  2. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    о, ужас, кто тебе это сказал?
    нифига она не должна возникать
     
  3. Tikson

    Tikson Elder - Старейшина

    Joined:
    9 Oct 2005
    Messages:
    263
    Likes Received:
    42
    Reputations:
    14
    выдержка из книги, может это я что-то неправильно понял...
    а что должно тогда происходить?
     
  4. Tikson

    Tikson Elder - Старейшина

    Joined:
    9 Oct 2005
    Messages:
    263
    Likes Received:
    42
    Reputations:
    14
    _Great_
    я совсем глупый вопрос задал? =)
    хоят там же написано...
     
  5. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    Попробуй запусти ее в отладчике и введи 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
     
  6. Zadoxlik

    Zadoxlik рояль с сыром

    Joined:
    28 Feb 2005
    Messages:
    758
    Likes Received:
    216
    Reputations:
    257
    Тут имеется ввиду переполнение в знаковом разряде
     
  7. Zadoxlik

    Zadoxlik рояль с сыром

    Joined:
    28 Feb 2005
    Messages:
    758
    Likes Received:
    216
    Reputations:
    257
    Не возникает, потому что 32767 - это максимальное знаковое int для 16битных систем. У тебя книга старая. Щас уже во всю у всех 32битные процы и соответствующие компиляторы. Не говорю уже о том, что многие пересаживаютчя на 64битные.

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

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    Аааа, если имеется в виду флаг Cf, тогда да.
     
  9. Zadoxlik

    Zadoxlik рояль с сыром

    Joined:
    28 Feb 2005
    Messages:
    758
    Likes Received:
    216
    Reputations:
    257
    Арифметических операций никаких не выполняется, поэтому флаг Cf тут непричем =Ь
     
  10. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    туплю %)
     
  11. Tikson

    Tikson Elder - Старейшина

    Joined:
    9 Oct 2005
    Messages:
    263
    Likes Received:
    42
    Reputations:
    14
    не , не происходит, ввожу 999999999999999999999999 и всеравно печатает
    посоветуйте новую , с сылкой если можно на скачку =)
     
  12. Zadoxlik

    Zadoxlik рояль с сыром

    Joined:
    28 Feb 2005
    Messages:
    758
    Likes Received:
    216
    Reputations:
    257
    А ты введи 2147483648 =)
     
    1 person likes this.
  13. Deem3n®

    Deem3n® RTFMSDN

    Joined:
    19 Sep 2005
    Messages:
    378
    Likes Received:
    153
    Reputations:
    164
    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
    что и выводится на экран :)
     
  14. Zadoxlik

    Zadoxlik рояль с сыром

    Joined:
    28 Feb 2005
    Messages:
    758
    Likes Received:
    216
    Reputations:
    257
    bof = buffer overflow = переполнение буфера =) И может случиться оно и до тех пор, когда биты вылезут за разрядную сетку, занимаемую переменной в памяти =Р Если тип signed
     
  15. Deem3n®

    Deem3n® RTFMSDN

    Joined:
    19 Sep 2005
    Messages:
    378
    Likes Received:
    153
    Reputations:
    164
    Zadoxlik - примером не порадуешь? А то у меня твой пост в голове не укладывается =)
     
  16. Zadoxlik

    Zadoxlik рояль с сыром

    Joined:
    28 Feb 2005
    Messages:
    758
    Likes Received:
    216
    Reputations:
    257
    Пример приведен топикстартером =)
     
  17. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    это произойдет еще на этапе компиляции, причем умный компилер даже выдаст ворнинг о превышении даипазона значений.

    никогда не получится запихнуть, например, в 2-х байтовую переменную три байта, поэтому переполнения буфера не будет никогда. Просто в переменную запишется другое, урезанное значение.
     
  18. Zadoxlik

    Zadoxlik рояль с сыром

    Joined:
    28 Feb 2005
    Messages:
    758
    Likes Received:
    216
    Reputations:
    257
    естественно =Ь Но ситуация когда в переменную пытаются записать значение б0льшее чем она может вместить тоже называется переполнением. Происходить может на операционном устройстве, тогда будет передано сообщение в виде установленного флага CF или на этапе компиляции, тогда об этом любезно скажет компилятор
     
    #18 Zadoxlik, 5 Jan 2007
    Last edited: 5 Jan 2007
  19. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    никто и не спорит :)
     
  20. Zadoxlik

    Zadoxlik рояль с сыром

    Joined:
    28 Feb 2005
    Messages:
    758
    Likes Received:
    216
    Reputations:
    257
    Да а еще может происходить просто при записи данных в память, выделенную под переменную, тогда об этом никто не скажет =) Как в примере автора темы
     
Loading...
Similar Threads - Программа ошибки переполнения
  1. Peja
    Replies:
    0
    Views:
    2,973
Thread Status:
Not open for further replies.