OberonCore
https://forum.oberoncore.ru/

#define TRUE (!FALSE)
https://forum.oberoncore.ru/viewtopic.php?f=27&t=2631
Страница 1 из 1

Автор:  Роман М. [ Понедельник, 10 Май, 2010 16:21 ]
Заголовок сообщения:  #define TRUE (!FALSE)

В одной небезызвестной библиотеке можно найти определение булевых ПРАВДА и ЛОЖЬ в виде следующих макросов:
Код:
#define FALSE (0)
#define TRUE (!FALSE)


С FALSE всё ясно. Ноль - и в Африке ноль. Вопрос: правильно ли я определил TRUE:
Код:
   CONST
      FALSE* = 0H; (* int32 *)
      TRUE* = 0FFFFFFFFH; (* ~FALSE*)
Или его определять как MIN(INTEGER)?

Кстати, надо подумать на досуге насчёт определения нового типа "МОЖЕТ БЫТЬ". :)

Автор:  Geniepro [ Понедельник, 10 Май, 2010 16:26 ]
Заголовок сообщения:  Re: #define TRUE (!FALSE)

Компилятор TinyC на такой код:
Код:
#include <stdio.h>

#define FALSE (0)
#define TRUE (!FALSE)

void main(void)
{
    printf("%X\n", TRUE);
}
выдаёт
Код:
1

Автор:  Александр Шостак [ Понедельник, 10 Май, 2010 16:50 ]
Заголовок сообщения:  Re: #define TRUE (!FALSE)

CONST FALSE = 0; TRUE = 1;

Автор:  Роман М. [ Понедельник, 10 Май, 2010 16:50 ]
Заголовок сообщения:  Re: #define TRUE (!FALSE)

ну если так, то непонятен механизм логического преобразования.

Автор:  Wlad [ Понедельник, 10 Май, 2010 17:40 ]
Заголовок сообщения:  Re: #define TRUE (!FALSE)

Роман М. писал(а):
ну если так, то непонятен механизм логического преобразования.

в си логический тип определяется со значениями 0 и 1.
попутно считается, что всё, что НЕ РАВНО 0 - истина.

то есть:

пусть

a = 0b01
b = 0b10

тогда

a & b == 0b00 == 0 == FALSE
a && b == (bool)0b01 && (bool)0b10 == TRUE && TRUE == TRUE == 1

или, ещё

с = 0b01

d = !c // == !((bool) 0b01) == ! TRUE == FALSE == 0
e = ~c // == ~0b0 == 0b10 == 1 == TRUE

будьте внимательны!

PS ещё более внимательны будьте в случае с работой с XOR-ом (^) это ПОБИТОВАЯ операция. со всеми вытекающими...
PPS строка e = ~c // == ~0b0 == 0b10 == 1 == TRUE
правильней бы, для иллюстрации, выглядела бы так:
e = !!~c // == !!~0b0 == !!0b10 == !!1 == !!TRUE == !FALSE == TRUE == 1

Автор:  Александр Шостак [ Понедельник, 10 Май, 2010 21:05 ]
Заголовок сообщения:  Re: #define TRUE (!FALSE)

FreePascal и Delphi: LongBool - полный аналог си-шного BOOL. Всё, что не 0 - истина.

Автор:  Wlad [ Понедельник, 10 Май, 2010 21:43 ]
Заголовок сообщения:  Re: #define TRUE (!FALSE)

Wlad2 писал(а):
Роман М. писал(а):
ну если так, то непонятен механизм логического преобразования.

в си логический тип определяется со значениями 0 и 1.


то есть, вам, для адекватного перевода на оберон, нужно явно определять функции ЛОГИЧЕСКИХ операций НАД ЦЕЛЫМИ!
и - не только. ещё - над целыми и логическими...
и - аналогичные АРИФМЕТИЧЕСКИЕ и битовые над ЛОГИЧЕСКИМИ (а - вперемешку с целыми).

в результате:
получаем:

1) арифметика над:
1.а) целым и целым
1.б) целым и логическим

2) битовые операции над:
2.а) целым и целым
2.б) целым и логическим
сюда же - битовая инверсия над обеими разновидностями типов

3) логические операции:
3.а) целым и целым
3.б) целым и логическим
сюда же - логическая инверсия над обеими разновидностями типов

И ВНИМАТЕЛЬНО преобразовывать сишные выражения в оберон-выражения...

в любом случае, "привести к общему базису" - не получится. природа типов и смысла операций - различна - именно придётся всё, что я описал - прописывать и елозить пальчиком по сишным выражениям... - артель "восход солнца вручную" приветствует вас! :)

Автор:  Александр Шостак [ Понедельник, 10 Май, 2010 22:05 ]
Заголовок сообщения:  Re: #define TRUE (!FALSE)

Проще определить функцю вроде Bool(Val: INTEGER), возвращающая нормальные TRUE/FALSE, в зависимости от значения Val.

Автор:  Wlad [ Понедельник, 10 Май, 2010 22:19 ]
Заголовок сообщения:  Re: #define TRUE (!FALSE)

Berserker писал(а):
Проще определить функцю вроде Bool(Val: INTEGER), возвращающая нормальные TRUE/FALSE, в зависимости от значения Val.
да-да... и - что дальше? ;)

Автор:  Роман М. [ Вторник, 11 Май, 2010 10:31 ]
Заголовок сообщения:  Re: #define TRUE (!FALSE)

Wlad2 писал(а):
то есть, вам, для адекватного перевода на оберон, нужно явно определять функции ЛОГИЧЕСКИХ операций НАД ЦЕЛЫМИ!
и - не только. ещё - над целыми и логическими...
и - аналогичные АРИФМЕТИЧЕСКИЕ и битовые над ЛОГИЧЕСКИМИ (а - вперемешку с целыми).
К счастью, мне требуется только интерфейс к этой библиотеке.

Спасибо за разъяснение!

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/