Из декомпиля: Код (Text): v23 = (size + 3) & 0xFFFFFFFC; if ( v23 < size ) goto ERROR Что это, защита от переполнения или что?
Выравнивание на границу 4х байт, плюс проверка на переполнение. (size + 3) & 0xFFFFFFFC - это по сути (size + 3) - ((size + 3) mod 4) size можно представить как 4*k + r (где k - результат целочисленного деления size на 4, r - остаток), тогда (4*k + r + 3) - ((4*k + r + 3) mod 4) = (4*k + r + 3) - ((r + 3) mod 4) Если r = 0 (size кратно 4), то всё просто: (4*k + 3) - 3 = 4*k Иначе, 4 > r >= 1, а значит 7 > (r + 3) >= 4, так что (r + 3) mod 4 = r - 1. Ну и в итоге v23 = (4*k + r + 3) - (r - 1) = 4*(k + 1) - т.е. v23 это size округлённое вверх до ближайшего кратного 4м. Ну а дальше проверяется условие v23 < size, а здесь это возможно только если при округлении произошло переполнение.
Вместо 3 можно любую степень двойки подставить: (x + (n-1))and not(n-1) Округление в бОльшую сторону до степени двойки.
hasztalan, > Иначе, 4 > r >= 1, а значит 7 > (r + 3) >= 4, так что (r + 3) mod 4 = r - 1. Ну и в итоге Стрёмно представить что у тебя в разуме творится..)