Внутреннее представление boolean

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
ahv
Новичок
Сообщения: 21
Зарегистрирован: 15 дек 2009, 07:52

Внутреннее представление boolean

Сообщение ahv »

Некоторые выражения дают неожиданные (возможно, только для меня) результаты. Галактика 8.10.

Код: Выделить всё

boolean(0) -> false // правильно
boolean(1) -> true // правильно
boolean(2) -> true // правильно
not boolean(0) -> true // правильно
not boolean(1) -> false // правильно
not boolean(2) -> true // неожиданно
not (not boolean(2)) -> true // еще более неожиданно
Почему так происходит?
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Re: Внутреннее представление boolean

Сообщение galover »

Действительно странно, какой-то нечестный boolean. Еще вот такой прикол:
integer(boolean(0))=0
integer(boolean(1))=1
integer(boolean(2))=2
...
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Re: Внутреннее представление boolean

Сообщение galover »

Еще чуть-чуть поэкспериментировал
В случае not(not boolean(n)) происходит просто вычисление boolean(n) и сравнение результата с нулем - результат ожидаемый.
В случае not boolean(n) происходит побитовая инвертация и сравнение с нулем. Т.е. в случае 2, сначала инвертация, потом сравнение с 0, что даст true в итоге. Неправильно конечно же. Но видимо предполагалось, что boolean будет принимать в качестве параметра только 0 или 1. По правильному boolean должна возвращать только 2 значения: 0(false) или 1(true).
ahv
Новичок
Сообщения: 21
Зарегистрирован: 15 дек 2009, 07:52

Re: Внутреннее представление boolean

Сообщение ahv »

а, инвертация только первого бита, ясно.
По правильному boolean должна возвращать только 2 значения: 0(false) или 1(true).
а точнее только true или false, только тогда это был бы полноценный тип. а уж что там лежит в байте под true и false должно быть секретом.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Re: Внутреннее представление boolean

Сообщение galover »

Похоже даже не инвертация первого бита, потому как первый бит = 1 у нечетных чисел (3,5,7,...). Инвертация 1 не будет нулем. Т.е. not boolean(1) возвращает то что нужно, хотя инвертация byte(1) даст 254. А вот not boolean(2,3,...) уже лажает. Т.е. тут по особому 1 обрабатывается. Результат будет верный, только если boolean принимает 1 или 0.
ahv
Новичок
Сообщения: 21
Зарегистрирован: 15 дек 2009, 07:52

Re: Внутреннее представление boolean

Сообщение ahv »

да нет, все одинаково обрабатывается. под первым битом я имел ввиду наименее значащий, т.е. в такой записи он последний:
"not" 00000000 = 00000001 -> true
"not" 00000001 = 00000000 -> false
"not" 00000010 = 00000011 -> true
"not" 00000011 = 00000010 -> true
"not" 00000100 = 00000101 -> true
...

например, integer(not boolean(253)) -> 252, т.к. "not" 11111101 дает 11111100.
Последний раз редактировалось ahv 20 авг 2010, 12:47, всего редактировалось 1 раз.
ahv
Новичок
Сообщения: 21
Зарегистрирован: 15 дек 2009, 07:52

Re: Внутреннее представление boolean

Сообщение ahv »

немного повторюсь для полноты.
здесь "not" = not boolean(...), конечно.
not boolean(1) возвращает что нужно именно потому, что "not" 1 дает 0.
not byte(1) в галактике кстати возвращает -2, а вот byte(not 1) = 254.
Ответить