Что делает конструкция?

Тема в разделе "WASM.BEGINNERS", создана пользователем ormoulu, 22 дек 2020.

  1. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.000
    Из декомпиля:
    Код (Text):
    1.         v23 = (size + 3) & 0xFFFFFFFC;
    2.         if ( v23 < size )
    3.           goto ERROR
    Что это, защита от переполнения или что?
     
  2. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.787
    ormoulu,

    Выравнивание на 4: (P + 3) & not(3).
     
  3. hasztalan

    hasztalan New Member

    Публикаций:
    0
    Регистрация:
    22 дек 2020
    Сообщения:
    1
    Выравнивание на границу 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, а здесь это возможно только если при округлении произошло переполнение.
     
  4. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.786
    Вместо 3 можно любую степень двойки подставить:
    (x + (n-1))and not(n-1)
    Округление в бОльшую сторону до степени двойки.
     
    TermoSINteZ нравится это.
  5. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.787
    hasztalan,

    > Иначе, 4 > r >= 1, а значит 7 > (r + 3) >= 4, так что (r + 3) mod 4 = r - 1. Ну и в итоге

    Стрёмно представить что у тебя в разуме творится..)
     
  6. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.000
    Ахаха, внезапно пригодилось (опять меня в Гугле забанили) так что спасибо еще раз :derisive: