оператор тильды, возвращающий -1, -2 вместо 0, 1 соответственно

Я немного озадачен этим. Я думал, что оператор ~ в С++ должен работать по-другому (не так в Matlab-y). Вот минимальный рабочий пример:

#include <iostream>
using namespace std;
int main(int argc, char **argv)
{
    bool banana = true;
    bool peach = false;
    cout << banana << ~banana << endl;
    cout << peach << ~peach << endl;
}

И вот мой вывод:

1-2
0-1

Я надеюсь, что кто-то будет иметь некоторое представление об этом.


person castle-bravo    schedule 24.02.2014    source источник
comment
Что вы ожидали? Это побитовая инверсия представления дополнения до двух значения, хранящегося в памяти.   -  person leemes    schedule 24.02.2014
comment
~ — это оператор двоичного не, поэтому двоичные все нули становятся двоичными всеми единицами и так далее.   -  person 500 - Internal Server Error    schedule 24.02.2014
comment
@leemes, я ожидал, что оператор ~ изменит true на false и наоборот, и по какой-то причине я подумал, что помню, как использовал его таким образом в прошлом. Кажется, что ~ работает со всем байтом - это плохо.   -  person castle-bravo    schedule 24.02.2014
comment
@castle-bravo Сначала я немного неправильно прочитал ваш вопрос, а именно подумал, что вы применяете операторы к целым числам. Тогда логическая инверсия была для меня не очень логичной как ожидание, поэтому я не знал, чего вы ожидаете. Теперь, когда я заметил, что вы видели это как инверсию логического значения, мне совершенно понятно, как вы это интерпретировали! И я признаю, это может сбивать с толку. :)   -  person leemes    schedule 25.02.2014
comment
@leemes, то, как я сформулировал заголовок вопроса, вероятно, привело к тому, что вы неправильно поняли мой смысл.   -  person castle-bravo    schedule 25.02.2014
comment
Точно. Я только посмотрел на название, надо было смотреть внимательнее. Виноват ;)   -  person leemes    schedule 26.02.2014


Ответы (2)


Именно это и должно происходить: когда вы инвертируете двоичное представление нуля, вы получаете отрицательную единицу; когда вы инвертируете двоичное представление единицы, вы получаете отрицательное два в дополнительном представлении двух.

00000000 --> ~ --> 11111111 // This is -1
00000001 --> ~ --> 11111110 // This is -2

Обратите внимание, что даже если вы начинаете с bool, оператор ~ приводит к тому, что значение повышается до int по правилам целочисленного повышения. Если вам нужно преобразовать bool в bool, используйте оператор ! вместо ~.

person Sergey Kalinichenko    schedule 24.02.2014
comment
и что после выполнения оператора ~ значение больше не интерпретируется как bool. - person user2485710; 24.02.2014
comment
Это делает все кристально ясным для меня. Спасибо. - person castle-bravo; 24.02.2014

~ является побитовым оператором НЕ, что означает, что он переворачивает все биты. Для логического НЕ вы должны использовать ! оператор

person anonymous    schedule 24.02.2014