Кто нить может объяснить сей феномен (C5ee-b)

Кто нить может объяснить сей феномен (C5ee-b):

  PROGRAM
  MAP
    ChangeValue(*? MyValue)
  END

 TstValue           ULONG

  CODE
  ! Так нормально
  TstValue = 1                             ; MESSAGE(TstValue)
  TstValue = BOR (TstValue, BSHIFT(1, 31)) ; MESSAGE(TstValue)
  TstValue = BXOR(TstValue, BSHIFT(1, 31)) ; MESSAGE(TstValue)

  ! А так нет, TstValue обнуляется после BXOR
  ChangeValue(TstValue)

 ChangeValue        PROCEDURE(*? MyValue)
  CODE
  MyValue = 1                            ; MESSAGE(MyValue)
  MyValue = BOR (MyValue, BSHIFT(1, 31)) ; MESSAGE(MyValue)
  MyValue = BXOR(MyValue, BSHIFT(1, 31)) ; MESSAGE(MyValue)

Когда TstValue LONG, работает нормально.

Сразу же отвечу на несколько писем по данной теме.

Во-первых, при передаче ULONG-переменной через не типизированную ссылку СОХРАНЯЕТСЯ тип ULONG. Так что, никаких преобразований на данном этапе не происходит. Во-вторых, исходя из первого — понятно, что и в процедуре не происходит никаких явных или неявных преобразований к LONG-типу.

Но! Именно из-за того, что в процедуре не происходит преобразование типа, переменная MyValue так и остается UFO-переменной с типом ULONG. А UFO-переменные ЛЮБОГО типа перед арифметическими операциями ВСЕГДА преобразуются в тип REAL. Именно из-за этого преобразования значение x80000001 становиться x80000000!!! Ну а дальше — понятно: BXOR(x80000000,x80000000) = 0!

Так что, это — не глюк Клариона. Точнее — не совсем глюк, а документированная фича! Из-за подобной фичи, например, невозможно во View-фильтр прямо передавать ULONG-константы.