Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Представление типа bool, Вопрос стандарта 
V
    Опции темы
SaDFromSpb
Дата 14.1.2007, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 5.4.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 3



В орейлевском справочнике по С++ (по стандарту iso/iec 14882) написано, что выражение типа bool может быть продвинуто к целому типу: false станет нулем, а true - единицей. Значит ли это, что эти логические значения представлены в  памяти как 00000000 и как 00000001 соответственно? То есть, могу ли я использовать оператор ^, как "исключающее или" в логических выражениях?
Ну, к примеру, определение, лежит ли точка x между xA и xB (при условии xA < xB = ?):
Код

if (x > xA ^ x > xB) {
   cout<<"Point is inside" << endl;
}
Если бы операция ^ была не побитовая, вопроса бы не возникло. Но вдруг, в каком-нибудь бородатом компиляторе окажется, что результат верного выражения (x > xA) представляется не как 00000001, а как что-нибудь вроде 00101101. При таком раскладе оператор ^ как всегда примется за побитовое исключающее или, а код станет делать совсем не то, что должен.
Пытался найти информацию по этому поводу в черновике стандарта, по ссылочке здесь вверху, но что-то не нашел. Не мог найти в содержании информацию о представлении типов в памяти, а поиска в моем просмотрщике пдф нету  smile 


--------------------
"За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001)
PM   Вверх
Daevaorn
Дата 14.1.2007, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(SaDFromSpb @  14.1.2007,  17:32 Найти цитируемый пост)
продвинуто

это как?
Цитата(SaDFromSpb @  14.1.2007,  17:32 Найти цитируемый пост)
if (x > xA ^ x > xB)

так ты вначале приведи, а уже потом применяй ^

ISO/IEC 14882 Second edition 2003-10-15
Цитата

[conv.integral] 4.7 Integral conversions
If the destination type is bool, see 4.12. If the source type is bool, the value false is converted to zero
and the value true is converted to one.

Цитата

[conv.bool] 4.12 Boolean conversions
An rvalue of arithmetic, enumeration, pointer, or pointer to member type can be converted to an rvalue of
type bool. A zero value, null pointer value, or null member pointer value is converted to false; any
other value is converted to true.


PM MAIL WWW   Вверх
MAKCim
Дата 14.1.2007, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



это не точно, но, имхо + gcc, bool в памяти - байт; false - 0; true - 1
Код

bool a = true;

int main() {
    bool b = false;
    return 0;
}

Код

.text
...
    movl    %esp, %ebp
    subl    $16, %esp
    movb    $0, -5(%ebp)
...
.data
    .type a, @object
    .size a, 1
a:
    .byte 1
...


Это сообщение отредактировал(а) MAKCim - 14.1.2007, 16:46


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
SaDFromSpb
Дата 14.1.2007, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 5.4.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 3



Цитата(Daevaorn @  14.1.2007,  16:43 Найти цитируемый пост)
Цитата(SaDFromSpb @  14.1.2007,  17:32 Найти цитируемый пост)
продвинуто
это как?

Ну всмысле продвижение типов автоматическое....

Цитата(Daevaorn @  14.1.2007,  16:43 Найти цитируемый пост)
так ты вначале приведи, а уже потом применяй ^

Ты о чем? Слева и справа результаты операций, которые bool возвращают...


Цитата(Daevaorn @  14.1.2007,  16:43 Найти цитируемый пост)
... and the value true is converted to one.
Ну вот и здорово!
Всем спасибо.


Это сообщение отредактировал(а) SaDFromSpb - 14.1.2007, 18:14


--------------------
"За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001)
PM   Вверх
Vyacheslav
Дата 15.1.2007, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Цитата(SaDFromSpb @  14.1.2007,  16:32 Найти цитируемый пост)
Ну, к примеру, определение, лежит ли точка x между xA и xB (при условии xA < xB = ?):

Код

if (x > xA ^ x > xB) {
   cout<<"Point is inside" << endl;
}


Любопытно, а почему просто нельзя
Код

if ( (x > xA) && ( x < xB) ) {
   cout<<"Point is inside" << endl;
}

Или это, чтобы  враги не догадались 


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Daevaorn
Дата 15.1.2007, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Vyacheslav @  15.1.2007,  11:54 Найти цитируемый пост)
Любопытно, а почему просто нельзя

видимо, потому что вопрос чисто философский.
PM MAIL WWW   Вверх
SaDFromSpb
Дата 15.1.2007, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 5.4.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 3



Vyacheslav, во-первых, я же написал, что мы не знаем, XА больше XB или наоборот, следовательно прийдется писать так:
Код

if ( (x > xA && x < xB) || (x > xB && x < xA) )

или так:
Код

if (x > MIN(xA, xB) && x < MAX(xA, xB))

В этих случаях будет очевидно больше операций, чем в моем случае (две операции сравнения и одна логическая побитовая).

Это будет использоваться в коде, который будет отрабатываться сотни миллионов раз (без преувиличения) при обработке графических данных.

Убедительно?


Цитата(Daevaorn @  15.1.2007,  10:56 Найти цитируемый пост)
видимо, потому что вопрос чисто философский. 

 smile ну пофилософствовать я тоже люблю иногда  smile 


Это сообщение отредактировал(а) SaDFromSpb - 15.1.2007, 18:11


--------------------
"За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001)
PM   Вверх
MAKCim
Дата 15.1.2007, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Код

if ((unsigned char) (x > xA) ^ (unsigned char) (x > xB)) {
   cout<<"Point is inside" << endl;
}



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Anikmar
Дата 15.1.2007, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Хм... Либо я напился...
if ( (x > xA) || (x > xB)) ...

Но точно можно попроще решить
PM MAIL ICQ   Вверх
SaDFromSpb
Дата 15.1.2007, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 5.4.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 3



Цитата(Anikmar @  15.1.2007,  18:20 Найти цитируемый пост)
Хм... Либо я напился...
if ( (x > xA) || (x > xB)) ...

А верхняя граница?
Цитата(Anikmar @  15.1.2007,  18:20 Найти цитируемый пост)
Но точно можно попроще решить
Ну давай. (Кстати твое решение по вычислительной нагрузке такое же (если забыть, что оно неверно))
Цитата(Anikmar @  15.1.2007,  18:20 Найти цитируемый пост)
Но точно можно попроще решить
Куда уж проще? Две точки - два сравнения, одна операция ^. Она для тебя сложна?

MAKCim, а что даст приведение к unsigned char? Оно по стандарту к единице приведется? Не будет ли это приведение считаться как операция, если булевский результат представлен не единицей?
Хотя приведение - в любом случае дополнительная операция. Вычислительная нагрузка увеличится.

Это сообщение отредактировал(а) SaDFromSpb - 15.1.2007, 21:05


--------------------
"За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001)
PM   Вверх
UnrealMan
Дата 16.1.2007, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(SaDFromSpb)
Если бы операция ^ была не побитовая, вопроса бы не возникло. Но вдруг, в каком-нибудь бородатом компиляторе окажется, что результат верного выражения (x > xA) представляется не как 00000001, а как что-нибудь вроде 00101101. При таком раскладе оператор ^ как всегда примется за побитовое исключающее или, а код станет делать совсем не то, что должен.

На самом деле представление тут не имеет никакого значения, поскольку продвижение происходит неявно (и не важно, что операция именно побитовая), т.е. в данном случае операнды типа bool оператора ^ сначала неявно приводятся к int, а затем уже происходит вычисление.

Цитата(ISO/IEC 14­882:2003(E) §5 Expressions)

Many binary operators that expect operands of arithmetic or enumeration type cause conversions and yield result types in a similar way. The purpose is to yield a common type, which is also the type of the result. This pattern is called the usual arithmetic conversions, which are defined as follows:

— If either operand is of type long double, the other shall be converted to long double.
— Otherwise, if either operand is double, the other shall be converted to double.
— Otherwise, if either operand is float, the other shall be converted to float.
— Otherwise, the integral promotions (4.5) shall be performed on both operands.[sup]54)[/sup]
— Then, if either operand is unsigned long the other shall be converted to unsigned long.
— Otherwise, if one operand is a long int and the other unsigned int, then if a long int can represent all the values of an unsigned int, the unsigned int shall be converted to a long int;
otherwise both operands shall be converted to unsigned long int.
— Otherwise, if either operand is long, the other shall be converted to long.
— Otherwise, if either operand is unsigned, the other shall be converted to unsigned.

[Note: otherwise, the only remaining case is that both operands are int ]

В свою очередь, как уже заметили ранее, продвижение bool к int обязано быть реализовано таким образом, чтобы false обращалось в ноль, а true – в единицу, независимо от представления bool.
PM MAIL   Вверх
SaDFromSpb
Дата 16.1.2007, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 5.4.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 3



UnrealMan, а можно ссылку на ISO/IEC 14­882:2003?

Получается, в этой операции присутствуют еще два приведения к интам с выделением памяти под них  smile ...
Будем надеятся, что это оптимизируется как-нибудь.


Это сообщение отредактировал(а) SaDFromSpb - 16.1.2007, 12:24


--------------------
"За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001)
PM   Вверх
Daevaorn
Дата 16.1.2007, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(SaDFromSpb @  16.1.2007,  13:23 Найти цитируемый пост)
Получается, в этой операции присутствуют еще два приведения к интам с выделением памяти под них  

не переживай, никаких выделений не будетsmile
Цитата(SaDFromSpb @  16.1.2007,  13:23 Найти цитируемый пост)
а можно ссылку на ISO/IEC 14­882:2003?

http://www.open-std.org/jtc1/sc22/wg21/
PM MAIL WWW   Вверх
UnrealMan
Дата 16.1.2007, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(SaDFromSpb)
UnrealMan, а можно ссылку на ISO/IEC 14­882:2003?

Только что привёл (4-й случай, выделенный пурпурным цветом. Там же есть номер пункта, где описываются продвижения).
PM MAIL   Вверх
Anikmar
Дата 16.1.2007, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Ради развлечения сделал 2 цикла по 6 миллионов проходов.

1-й вариант
        if ((i>Ax)^(i<Bx)) j=0;

2-й вариант
        if ((i>Ax)&&(i<Bx)) j=0;


1-й вариант работал 2 минуты 17 секунд
2-й вариант 2 минуты 16 секунд

Так что к вопросу об экономии вычислительной мощности... В ассемблерный код не лез - просто развлекаюсь  smile 
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0601 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.