Переполнение и ошибки при работе с целыми типами в Си

แชร์
ฝัง
  • เผยแพร่เมื่อ 19 ธ.ค. 2024

ความคิดเห็น • 69

  • @juvusart
    @juvusart 5 ปีที่แล้ว +97

    Спасибо! Решил просто лекцию просмотреть про указатели в Си, но подача материала настолько увлекательна, что начал смотреть с самой первой лекции, даже не для того, чтобы узнать что-то новое, а просто из-за того, как это всё преподносится! Высший пилотаж!!!

    • @nickjonas8257
      @nickjonas8257 4 ปีที่แล้ว +7

      аналогично))

    • @AleksBojko
      @AleksBojko 3 ปีที่แล้ว +2

      Тоже решил посмотреть все с начала, хотя пока что ничего нового для меня, но рассказывает интересно, да и повторить не помешает.

    • @misha2993
      @misha2993 2 ปีที่แล้ว +4

      Аахах у меня точно также. Начал с указателей и перешёл сюда

    • @juvusart
      @juvusart 2 ปีที่แล้ว +3

      @@misha2993 Указатели...они указывают)

    • @samirprostov5554
      @samirprostov5554 ปีที่แล้ว

      +

  • @sanctuary_of_soul
    @sanctuary_of_soul 2 ปีที่แล้ว +11

    Я хотел найти курс молодого бойца военного, но в числе попался и этот курс. Очень доходчиво, с деталями, практически ничего не упускается из виду, по крайней мере важного.
    И подача происходит в частично вольной форме: есть и шутка, интонация, речевая динамика. В общем очень интересно слушать и, главное, поучительно!
    Спасибо!!!

    • @lalivirtei
      @lalivirtei 2 ปีที่แล้ว +4

      То чувство, когда хотел на контракт, а случайно стал программистом? Бывает, понимаю =)

  • @mrslavik2104
    @mrslavik2104 3 ปีที่แล้ว +10

    пол видео офигевал от происходящего, но в конце пришло озарение, понимание пришло)) Спасибо за крутые уроки по С)

  • @adwer123
    @adwer123 6 ปีที่แล้ว +28

    Тимофей, спасибо огромное за лекции !

  • @Brucelans
    @Brucelans 3 ปีที่แล้ว +4

    Спасибо за видео!
    Заметил такую, может и логичную, закономерность - обучающие онлайн лекции действующих преподавателей ВУЗов, что иностранных, что отечественных в подавляющем большинстве случаев на голову превосходят своих иных онлайн собратьев не имеющих отношения к преподавательской деятельности.
    Видимо дело в опыте донесения знаний и системности подачи материала.

  • @sergeismazheluk1662
    @sergeismazheluk1662 5 ปีที่แล้ว +4

    спасибо огромное!!! лекции супер...по-чаще бы выходили лекции

  • @ivanovsergiu8575
    @ivanovsergiu8575 5 ปีที่แล้ว +10

    Тимофей Хирьянов
    Samyi lutsii prepodovateli, daje v Velikobritanii v univere nam tak ne prepodnosyat tak material. Maladets!

    • @bogdantymKOLUBO
      @bogdantymKOLUBO ปีที่แล้ว

      Где именно не преподают?

  • @SAM-t6k7s
    @SAM-t6k7s 3 ปีที่แล้ว

    Тимофей спосибо.
    Пока что в ютюбе самые понятные ролики по программированию это твои.
    Я изучаю СИ и подписан на твой канал .

  • @_RUDE_
    @_RUDE_ 4 หลายเดือนก่อน

    Отличые лекции, спасибо вам большое 👍

  • @w.t.2905
    @w.t.2905 4 ปีที่แล้ว +4

    Целочисленное переполнение стало причиной падения ракеты Ариан 5. Также, показываю целочисленное переполнение на примере GTA 3 на своём канале, если кому интересно.

  • @melangeshark
    @melangeshark 5 ปีที่แล้ว +3

    Огромное спасибо за лекции!

  • @LLlblKAPHO
    @LLlblKAPHO 2 ปีที่แล้ว +5

    это ошибку, а точнее андерфлоу, можно наблюдать в игре Цивилизация, там у Индии один из низких показателей воинственности (мирная цивилизация), а после изучения техи ядерного оружия, у всех наций снижается этот показатель. И у Индии он становится максимальным (мы щас про ботов говорим). В итоге Индия слетает с катушек и начинает всех бомбить ядерками. Очень весело

    • @horan4president
      @horan4president 29 วันที่ผ่านมา

      ого, даже не догадывалась, что в этом причина.
      емнип в героях каких-то тоже есть баг с величиной армий из-за целочисленного переполнения

  • @Im_like_Merphy
    @Im_like_Merphy 2 ปีที่แล้ว

    Классно, спасибо за подачу информации

  • @grom3
    @grom3 4 ปีที่แล้ว

    Потрясающе понятно и интересно

  • @namename2031
    @namename2031 3 ปีที่แล้ว +2

    20:09 Почему даст отрицательное число. Умножаются ведь одинаковые типы int*int
    Привели ведь char явно к int
    Нифига не понятно
    Вот сделал как вы и сказали
    int main()
    {
    signed int a= 5;
    printf("%d
    ", (int)a*10);
    return 0;
    }
    ЗНАКОВЫЙ ТИП 19:29 переменной А умножается на 10. Ниаких переполнений нет.
    Даже если сделать беззнаковый тип, то нет переполнений.
    Очень интересно, но ни*рена непонятно.

    • @7qim
      @7qim 3 ปีที่แล้ว +1

      Он неправильно сказал, умножение вообще можно убрать. Всё дело в _"char с = 'Я';",_ поскольку _char_ в действительности то же самое, что _signed char,_ а не _unsigned char._

    • @namename2031
      @namename2031 3 ปีที่แล้ว +1

      @@7qim Символ 'Я' в ASCII это число 255.
      255*10=2550
      int d не способно сохранить число 2550?

    • @namename2031
      @namename2031 3 ปีที่แล้ว +1

      @@7qim Если убрать умножение, то ещё непонятнее. char не способно сохранить символ 'Я'?

    • @namename2031
      @namename2031 3 ปีที่แล้ว +1

      @@7qim Проверил у себя, выдаёт -33 символ 'Я'.
      Не понял, в каком типе переменных тогда хранить букву 'Я'?))
      Она имеет число 255 в коде, а 255 в 8 бит уже не помещается.

    • @7qim
      @7qim 3 ปีที่แล้ว +7

      @@namename2031 В ASCII нет буквы "Я", ASCII это вообще 7-битовая таблица (коды от 0 до 127 включительно).
      Буква "Я" в разных кодовых таблицах имеет разные значения. Например, в OEM-866 (так же известной как кодировка DOS), это 159(0x9F), в кодировке Windows-1251, это 223 (0xDF).
      _char_ способен хранить любой 8-битовый символ, включая символ 'Я', но при попытке обработать его в виде числа (кода символа), можем попасть на грабли в виде отрицательных чисел. Если хотим шаманить с кодами символов, то лучше приводить явно к типу _unsigned char,_ то есть писать нечто вроде _"(unsigned char)a",_ вместо просто _"а",_ это если _а_ у нас определено как _char._
      255 прекрасно укладывается в 8 бит, потому что это ровно 8 битовых единиц (1 байт это значения от 0 до 255 включительно, а для знакового типа от -128 до 127 включительно).
      255 это код маленькой буквы "я", а у большой код 223, отсюда в знаковом типе и значение -33 вылазит (223-256), а для "я" будет соответственно -1 (255-256).

  • @namename2031
    @namename2031 3 ปีที่แล้ว +1

    А про переполнение float есть видео?

  • @pro100SOm
    @pro100SOm 6 ปีที่แล้ว +2

    Тимофей, а как Вы прокомментируете рекомендации Страуструпа использовать именно типы int, double, char безо всяких приставок (если нет особой необходимости в отступлении от этих типов) ?
    Конечно, Страуструп дает такие рекомендации в отношении С++... неужели даже в таких вопросах эти языки настолько отличаются?

  • @Лоли-девелопер
    @Лоли-девелопер 3 ปีที่แล้ว +1

    Люблю вас нимагу

  • @dantesalighieri
    @dantesalighieri 3 ปีที่แล้ว +1

    Тимофей, я Вас люблю!

  • @spolyr
    @spolyr 2 ปีที่แล้ว

    Здравствуйте!
    Скажите пожалуйста как подключить библиотеку уже готовую(dll) к си проекту.
    Спасибо

  • @ПавелФомиченко-з5ш
    @ПавелФомиченко-з5ш ปีที่แล้ว

    Приветствую, а как на курс зарегистрироваться, подскажите?

  • @romanbrazhnikov9049
    @romanbrazhnikov9049 6 ปีที่แล้ว +4

    Очень крутые лекции
    PS на счёт английского:
    unknown - [ан-ноун] - неизвестный
    character - [керэктэр] - символ, хотя тип char - чар

  • @iwfttl
    @iwfttl 3 ปีที่แล้ว

    Только чистый си, по заветам старой школы

  • @mihaitimofti9789
    @mihaitimofti9789 3 ปีที่แล้ว

    bool не стандарт вроде, нет?
    он по памяти тоже берет один байт поэтому лучше взять либо char либо извращаться с битовыми полями

    • @mihaitimofti9789
      @mihaitimofti9789 3 ปีที่แล้ว

      по крайней мере я так слышал

    • @krsr454
      @krsr454 3 ปีที่แล้ว

      Со стандарта С99 вводится встроенный булевой тип _Bool. Он является так же целочисленным типом, только с диапазоном 0 и 1.
      В этом же стандарте добавился и заголовочный файл stdbool.h с типом bool и значениями для него false и true, но по факту,
      bool - будет лишь псевдонимом для _Bool

    • @trigeminalneuralgia9889
      @trigeminalneuralgia9889 ปีที่แล้ว

      @@krsr454 typedef enum { false, true } bool;

  • @АнатолийТолмачевский
    @АнатолийТолмачевский 2 ปีที่แล้ว +1

    Да ёлки же моталки.) Не мне поправлять таких гуру, только с уважением. Я вообще нуб , но когда заголовочный файл называют библиотекой, ну очень слух режет) си вообще не предусматривает подключение библиотеки из исходного кода.

    • @nelavas4651
      @nelavas4651 2 หลายเดือนก่อน

      ты уверен в своих словах?

  • @sluge1
    @sluge1 6 ปีที่แล้ว +2

    Все же в С слово overflow относится только к знаковым типам а wrap around к беззнаковым

  • @subterraneanrose4404
    @subterraneanrose4404 5 ปีที่แล้ว +1

    А на языках совсем-совсем уж высоких уровней разве таких проблем нет?

  • @dmitriykonopinskiy3793
    @dmitriykonopinskiy3793 4 ปีที่แล้ว

    Очень странно что там 0 получился, обычно компилятор просто излишек невлезший записывает
    Вот и у меня на Mingv через блокнот в консоле выдаёт -2.

  • @SalikhovDamir
    @SalikhovDamir 5 ปีที่แล้ว

    Что значит знаковый char?

    • @skva85
      @skva85 4 ปีที่แล้ว

      По идее символьный тип char.

    • @nanoqsh
      @nanoqsh 4 ปีที่แล้ว

      Целое однобайтовое число со знаком

    • @千里之行始于足下-n9u
      @千里之行始于足下-n9u 4 ปีที่แล้ว +2

      Знаковый: signed char (от -128 до 127)
      Беззнаковый: unsigned char (от 0 до 255)

  • @yummiem1811
    @yummiem1811 5 ปีที่แล้ว

    супер.

  • @OlegSklyarov
    @OlegSklyarov 4 ปีที่แล้ว +1

    Интересно, что для типа int переполнения не возникает. И ещё: компилятор gcc делает все вычисления на этапе компиляции, а в не с процессе запуска программы. Это можно увидеть, если запустить gcc с опцией -S.
    signed int a = -100 + 10U;
    signed long b = -100 + 10U;
    printf("a = %d
    ", a); // a = -90
    printf("b = %ld
    ", b); // b = 4294967206

    • @nanoqsh
      @nanoqsh 4 ปีที่แล้ว

      Переполнение происходит с каждым целочисленным типом, и с int в том числе. Но в данном примере переполнения не происходит, потому что 4294967196 (-100 в беззнаковом представлении) + 10 входит в диапазон int.

    • @ВикторБородин-р6с
      @ВикторБородин-р6с 4 ปีที่แล้ว

      Интересно, поменяется ли поведение если отключить оптимизации

    • @ВикторБородин-р6с
      @ВикторБородин-р6с 4 ปีที่แล้ว

      @@nanoqsh они входят в любой диапазон unsigned чисел. Там была ошибка связана не с переполнением именно в этом примере, а с неявным преобразованием -100 в тип unsigned. Это при любом типе приведёт к такому результату, если компилятор решит делать неявное преобразование в сторону unsigned. При этом кстати диапазон long long больше чем int. Это тем более должно вас отвратить от мысли, что проблема связана с переполнением.

  • @Witcherinrivia47
    @Witcherinrivia47 ปีที่แล้ว

    11:02
    16:24

  • @batfist6595
    @batfist6595 5 ปีที่แล้ว +1

    Просто снас

  • @vip51000
    @vip51000 4 ปีที่แล้ว +4

    Почему вы называете инклуд-файлы библиотеками? Вас я считаю грамотным спецом, не хочу услышать такое от вас.

    • @nanoqsh
      @nanoqsh 4 ปีที่แล้ว

      А что не так?

    • @千里之行始于足下-n9u
      @千里之行始于足下-n9u 4 ปีที่แล้ว +1

      Правильно: заголовочные файлы.

    • @nanoqsh
      @nanoqsh 4 ปีที่แล้ว

      Всё равно тупая придирка. И так понятно что имеется в виду

    • @tochka832
      @tochka832 3 ปีที่แล้ว

      ну так они в любом случае указывают на "библиотеки" или что угодно исполняемое

    • @sslem1285
      @sslem1285 3 ปีที่แล้ว

      потому что некоторые инклуд-файлы это библиотеки функций