Мало чем отличается от переполнения при сложении.
Отличается, и сильно: переполнение приводит к установке OF, это легко отследить. А вот как узнать, что старшие три байта никто не читал?
Можно, для этого не обязательно пользоваться командой push. Есть ещё зачастую более эффективная команда mov, и хороший компилятор ею пользуется, если это выгодно.
Как все-таки здорово, что x86 позволяет misalignment, правда? На ARM это не прокатило бы, ну так там и параметры традиционно идут в регистрах — которые отнюдь не байтовые.
В том же Паскале есть механизм приведения типов (или уж не помню, как он называется). Запросто можно написать то-нибудь типа byte(c):=i или там char(b):='&', или наоборот, и это весьма эффективно. Если, конечно, хоть изредка приходить в сознание.
Вот именно — есть механизм
явного приведения типов (в любом языке). И используется он для двух вещей:
1) Сказать компилятору "Ты этого не знаешь, но на самом деле это значение — вот такого типа, а не того, которого ты думаешь". При этом никакого кода не генерируется, просто компилятор начинает считать, что тип у переменной другой. Пример:
char *t = (char*)malloc(32 * sizeof(char));2) Сказать компилятору "Я хочу преобразовать значение одного типа в значение другого типа". При этом компилятор вставляет код, который преобразует значение одного типа в значение другого типа. Пример:
float x = 2.0; int y = (int)x;Я могу раскопать статью о неявных приведениях типов в C (кажется), в которой показывается, как вроде бы безобидные арифметические выражения могут иметь результатом ответ, резко отличающийся от задуманного программистом.