Целочисленное переполнение. Декларация переменных целых типов. Демонстрация переполнения. Неявное приведение типов: проблема с unsigned и signed. Явное приведение типов. Курс молодого бойца по информатике (Язык Си). cs.mipt.ru/c_intro
Спасибо! Решил просто лекцию просмотреть про указатели в Си, но подача материала настолько увлекательна, что начал смотреть с самой первой лекции, даже не для того, чтобы узнать что-то новое, а просто из-за того, как это всё преподносится! Высший пилотаж!!!
Я хотел найти курс молодого бойца военного, но в числе попался и этот курс. Очень доходчиво, с деталями, практически ничего не упускается из виду, по крайней мере важного. И подача происходит в частично вольной форме: есть и шутка, интонация, речевая динамика. В общем очень интересно слушать и, главное, поучительно! Спасибо!!!
Спасибо за видео! Заметил такую, может и логичную, закономерность - обучающие онлайн лекции действующих преподавателей ВУЗов, что иностранных, что отечественных в подавляющем большинстве случаев на голову превосходят своих иных онлайн собратьев не имеющих отношения к преподавательской деятельности. Видимо дело в опыте донесения знаний и системности подачи материала.
это ошибку, а точнее андерфлоу, можно наблюдать в игре Цивилизация, там у Индии один из низких показателей воинственности (мирная цивилизация), а после изучения техи ядерного оружия, у всех наций снижается этот показатель. И у Индии он становится максимальным (мы щас про ботов говорим). В итоге Индия слетает с катушек и начинает всех бомбить ядерками. Очень весело
Целочисленное переполнение стало причиной падения ракеты Ариан 5. Также, показываю целочисленное переполнение на примере GTA 3 на своём канале, если кому интересно.
Тимофей, а как Вы прокомментируете рекомендации Страуструпа использовать именно типы int, double, char безо всяких приставок (если нет особой необходимости в отступлении от этих типов) ? Конечно, Страуструп дает такие рекомендации в отношении С++... неужели даже в таких вопросах эти языки настолько отличаются?
Да ёлки же моталки.) Не мне поправлять таких гуру, только с уважением. Я вообще нуб , но когда заголовочный файл называют библиотекой, ну очень слух режет) си вообще не предусматривает подключение библиотеки из исходного кода.
20:09 Почему даст отрицательное число. Умножаются ведь одинаковые типы int*int Привели ведь char явно к int Нифига не понятно Вот сделал как вы и сказали int main() { signed int a= 5; printf("%d ", (int)a*10); return 0; } ЗНАКОВЫЙ ТИП 19:29 переменной А умножается на 10. Ниаких переполнений нет. Даже если сделать беззнаковый тип, то нет переполнений. Очень интересно, но ни*рена непонятно.
Он неправильно сказал, умножение вообще можно убрать. Всё дело в _"char с = 'Я';",_ поскольку _char_ в действительности то же самое, что _signed char,_ а не _unsigned char._
@@7qim Проверил у себя, выдаёт -33 символ 'Я'. Не понял, в каком типе переменных тогда хранить букву 'Я'?)) Она имеет число 255 в коде, а 255 в 8 бит уже не помещается.
@@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).
Со стандарта С99 вводится встроенный булевой тип _Bool. Он является так же целочисленным типом, только с диапазоном 0 и 1. В этом же стандарте добавился и заголовочный файл stdbool.h с типом bool и значениями для него false и true, но по факту, bool - будет лишь псевдонимом для _Bool
Интересно, что для типа 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
Переполнение происходит с каждым целочисленным типом, и с int в том числе. Но в данном примере переполнения не происходит, потому что 4294967196 (-100 в беззнаковом представлении) + 10 входит в диапазон int.
@@nanoqsh они входят в любой диапазон unsigned чисел. Там была ошибка связана не с переполнением именно в этом примере, а с неявным преобразованием -100 в тип unsigned. Это при любом типе приведёт к такому результату, если компилятор решит делать неявное преобразование в сторону unsigned. При этом кстати диапазон long long больше чем int. Это тем более должно вас отвратить от мысли, что проблема связана с переполнением.