Страница 1 из 1

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

Добавлено: 20 авг 2010, 07:54
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 // еще более неожиданно
Почему так происходит?

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

Добавлено: 20 авг 2010, 11:04
galover
Действительно странно, какой-то нечестный boolean. Еще вот такой прикол:
integer(boolean(0))=0
integer(boolean(1))=1
integer(boolean(2))=2
...

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

Добавлено: 20 авг 2010, 11:22
galover
Еще чуть-чуть поэкспериментировал
В случае not(not boolean(n)) происходит просто вычисление boolean(n) и сравнение результата с нулем - результат ожидаемый.
В случае not boolean(n) происходит побитовая инвертация и сравнение с нулем. Т.е. в случае 2, сначала инвертация, потом сравнение с 0, что даст true в итоге. Неправильно конечно же. Но видимо предполагалось, что boolean будет принимать в качестве параметра только 0 или 1. По правильному boolean должна возвращать только 2 значения: 0(false) или 1(true).

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

Добавлено: 20 авг 2010, 11:33
ahv
а, инвертация только первого бита, ясно.
По правильному boolean должна возвращать только 2 значения: 0(false) или 1(true).
а точнее только true или false, только тогда это был бы полноценный тип. а уж что там лежит в байте под true и false должно быть секретом.

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

Добавлено: 20 авг 2010, 11:47
galover
Похоже даже не инвертация первого бита, потому как первый бит = 1 у нечетных чисел (3,5,7,...). Инвертация 1 не будет нулем. Т.е. not boolean(1) возвращает то что нужно, хотя инвертация byte(1) даст 254. А вот not boolean(2,3,...) уже лажает. Т.е. тут по особому 1 обрабатывается. Результат будет верный, только если boolean принимает 1 или 0.

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

Добавлено: 20 авг 2010, 12:05
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.

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

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