Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как работает макрос?


Автор: Alca 16.4.2009, 16:07
Объясните как работает этот макрос.
Код

#define INVALID_SOCKET  (SOCKET)(~0)


Добавлено через 1 минуту и 6 секунд
Что за (~0)?

Автор: Lazin 16.4.2009, 16:14
оператор ~

Автор: Alca 16.4.2009, 16:29
Цитата

оператор ~

а чего он делает?

Автор: J0ker 16.4.2009, 16:33
Цитата(Alca @ 16.4.2009,  16:29)
Цитата

оператор ~

а чего он делает?

абалдеть  smile 

Автор: mes 16.4.2009, 16:33
операция NOT - инвертирует биты, для signed типов ~0 == -1

Автор: Alca 16.4.2009, 16:34
Цитата

абалдеть 

 smile

Добавлено через 57 секунд
Объясните как работает этот макрос. smile 

Автор: J0ker 16.4.2009, 16:37
(SOCKET)0xFFFFFFFF

Автор: jonie 17.4.2009, 09:16
J0ker вовсе не так. У меня 64 бит система, например 8)

в общем он (operator~ для чисел обычных) берет биты (они все равны у нас нулю) и делает из них 1-ки. Полученное число приводится к типу SOCKET.

вообщем - читайте дискретку)

Автор: Alca 17.4.2009, 09:32
Код

    int x0 = (~0);
    int x1 = (SOCKET)(~0);
    int x2 = (-1);
    int x3 = INVALID_SOCKET;
    int x4 = SOCKET_ERROR;

x0, x1, x2, x3, x4 равны - 1; (VC++ 2008, WinXP 32 bit)

Добавлено через 12 минут
Код

SOCKET x0 = (~0);
SOCKET x1 = (SOCKET)(~0);
SOCKET x2 = (-1);
SOCKET x3 = INVALID_SOCKET;
SOCKET x4 = SOCKET_ERROR;


Цитата

x3    4294967295    unsigned int
x0    4294967295    unsigned int
x1    4294967295    unsigned int
x4    4294967295    unsigned int
x2    4294967295    unsigned int

 smile 

Автор: vinter 17.4.2009, 10:02
Alca, это ты к чему?

Автор: Alca 17.4.2009, 10:07
Цитата

Alca, это ты к чему?

Мне был интересен конечный результат оператора ~.

Автор: inside_pointer 17.4.2009, 11:21
Код

~0 == ~((unsigned int) 0), (int) (UINT_MAX-0)


то есть она, чтобы обратить биты у знакового, переводит его в беззнаковый, вычитает из максимального беззнакового число, а потом результат переводит в знаковый обратно

Добавлено через 4 минуты и 16 секунд
а SOCKET, если ты под виндой, то там для хендлов чаще используются unsigned long'и
то есть, если это так, то потом знаковый при присваивании будет приводиться к беззнаковому

Автор: Rickert 17.4.2009, 12:00
~ - оператор инверсии битов. Если взять число, для которого он применён, в двоичной форме, то все 0 меняются на 1, а 1 на 0.
А (SOCKET) - это приведение типов.

Автор: zim22 17.4.2009, 12:06
Цитата(inside_pointer @  17.4.2009,  11:21 Найти цитируемый пост)
:~0 == ~((unsigned int) 0), (int) (UINT_MAX-0)

вы этот код сами придумали?

Автор: Alca 17.4.2009, 12:07
Цитата

~ - оператор инверсии битов. Если взять число, для которого он применён, в двоичной форме, то все 0 меняются на 1, а 1 на 0.

тогда x0 должно быть 1
Код

int x0 = (~0);  //однако x0 = - 1

Автор: Lazin 17.4.2009, 12:12
Цитата(Alca @  17.4.2009,  12:07 Найти цитируемый пост)
тогда x1 должно быть 1

почему?

Добавлено через 50 секунд
я знаю чему оно должно быть равно, просто мне интересен ход мыслей, который мог привести к этому выводу ))

Автор: Alca 17.4.2009, 12:18
Цитата

почему?

Типа так должно быть (в двоичной)?
0000 -> 1111

Добавлено через 1 минуту и 40 секунд
http://ru.wikipedia.org/wiki/Битовые_операции

Добавлено через 2 минуты и 6 секунд
Цитата

НЕ
«(Логическое) НЕ» (not), инвертирование — аналог отрицания в логике.В булевой логике:  В языке C: ~
Данная унарная операция (с одним входом) заменяет 0 на 1 и наоборот. Реализующий её элемент называется инвертором.


Добавлено через 4 минуты
Цитата

я знаю чему оно должно быть равно

Чему?

Автор: zim22 17.4.2009, 12:26
Alca, а вы так попробуйте
Код

unsigned x0 = (~0);

Автор: Alca 17.4.2009, 12:34
Цитата

Alca, а вы так попробуйте
Код

unsigned x0 = (~0);


Цитата

Код

SOCKET x0 = (~0);
SOCKET x1 = (SOCKET)(~0);
SOCKET x2 = (-1);
SOCKET x3 = INVALID_SOCKET;
SOCKET x4 = SOCKET_ERROR;

Цитата

x3    4294967295    unsigned int
x0    4294967295    unsigned int
x1    4294967295    unsigned int
x4    4294967295    unsigned int
x2    4294967295    unsigned int


Автор: zim22 17.4.2009, 12:43
Цитата(Alca @  17.4.2009,  12:34 Найти цитируемый пост)
x3    4294967295    unsigned int

всё правильно. так и должно быть. поверьте, компилятор вас не дурит smile
Код

signed int x0 = -1; // x0 == -1
unsigned int x1 = x0; // x1 == 4294967295

Автор: inside_pointer 17.4.2009, 15:30
Цитата(zim22)

вы этот код сами придумали?

там неявные приведения типов, и он не инверсирует биты, а проводит вот такую операцию вычитания из большего значения
это последовательность того, как происходит операция smile

похожее происходит при операции одноместного минуса

Автор: mes 17.4.2009, 15:40
Цитата(inside_pointer @  17.4.2009,  14:30 Найти цитируемый пост)

там неявные приведения типов, и он не инверсирует биты, а проводит вот такую операцию вычитания из большего значения
это последовательность того, как происходит операция smile

кто вас такк обманул то ?!

Автор: inside_pointer 17.4.2009, 15:50
Цитата(mes)

кто вас такк обманул то ?! 

в чём ?

http://bookc.narod.ru/aa7_4_6.html

Автор: J0ker 17.4.2009, 15:57
какой флуд можно развети на тему элементарного оператора, однако...

Автор: inside_pointer 17.4.2009, 16:05
ну, если у майкрософт учишься - конечно
они вон и сертификатами торгуют, программы два притопа три прихлопа пропихиваются, как нечто грандиозное

Автор: J0ker 17.4.2009, 16:59
Цитата(inside_pointer @  17.4.2009,  15:30 Найти цитируемый пост)
там неявные приведения типов, и он не инверсирует биты, а проводит вот такую операцию вычитания из большего значения
это последовательность того, как происходит операция 

правда???????????
а я-то наивный думал, что для численных констант это compile time инвертирование, а для переменных - ассемблерная  операция not

inside_pointer, ты хоть фантазируй более правдоподобно, чтоль...

Автор: vinter 17.4.2009, 17:11
Цитата(J0ker @  17.4.2009,  16:57 Найти цитируемый пост)
какой флуд можно развети на тему элементарного оператора, однако...

чем проще конструкция, тем у большего количества людей есть свои мнения smile

Автор: inside_pointer 17.4.2009, 18:03
Цитата(J0ker)

что для численных констант это compile time инвертирование

а что это меняет ?

Автор: J0ker 17.4.2009, 20:24
Цитата(inside_pointer @  17.4.2009,  18:03 Найти цитируемый пост)
а что это меняет ?

уменьшает расход электоэнергии
причем на обоих этапах - компиляции и выполнения
 smile 

Автор: GoldFinch 17.4.2009, 20:48
в который раз удивляюсь как программисты могут обсуждать такие тривиальные вещи
представление данных и работа с ними - это же азы информатики, все программисты должны это знать %)

Автор: J0ker 18.4.2009, 00:16
Цитата(GoldFinch @ 17.4.2009,  20:48)
в который раз удивляюсь как программисты могут обсуждать такие тривиальные вещи
представление данных и работа с ними - это же азы информатики, все программисты должны это знать %)

где вы тут программистов-то увидели? тут только ламеры да джедаи  smile 

Автор: Anikmar 18.4.2009, 00:25
Цитата(J0ker @  18.4.2009,  00:16 Найти цитируемый пост)
где вы тут программистов-то увидели? тут только ламеры да джедаи    

 smile  А почему тогда не так:
Тут только ламеры, джедаи, J0ker и GoldFinch.
 smile 

Автор: J0ker 18.4.2009, 00:39
Цитата(Anikmar @ 18.4.2009,  00:25)
Цитата(J0ker @  18.4.2009,  00:16 Найти цитируемый пост)
где вы тут программистов-то увидели? тут только ламеры да джедаи    

 smile  А почему тогда не так:
Тут только ламеры, джедаи, J0ker и GoldFinch.
 smile

потому, что GoldFinch - джедай  smile 

Автор: inside_pointer 18.4.2009, 03:23
Цитата(J0ker)

уменьшает расход электоэнергии

вот именно, потому и знать это не надо, так как это не стандарт, компиляторов-то много, а стандарт один

Автор: J0ker 18.4.2009, 08:02
Цитата(inside_pointer @  18.4.2009,  03:23 Найти цитируемый пост)
вот именно, потому и знать это не надо, так как это не стандарт, компиляторов-то много, а стандарт один 

Цитата(inside_pointer @  17.4.2009,  15:30 Найти цитируемый пост)
там неявные приведения типов, и он не инверсирует биты, а проводит вот такую операцию вычитания из большего значения
это последовательность того, как происходит операция

вы для начала откомпилируйте и посмотрите
в стандарте дано описание поведения этого оператора, но на самом деле такого бреда естественно не происходит - никакого вычитания там нет - практически у любого процессора есть операция not - это одна из основополагающих операций, а приведение типов - это вообще функция компилятора - в выполняемом коде никаких приведений типов нет, кроме как в/из FP

Автор: inside_pointer 18.4.2009, 08:37
Цитата(J0ker)

в выполняемом коде никаких приведений типов нет

а, ну ясно тогда

Автор: GoldFinch 18.4.2009, 10:12
Цитата(J0ker @  18.4.2009,  09:02 Найти цитируемый пост)
а приведение типов - это вообще функция компилятора - в выполняемом коде никаких приведений типов нет, кроме как в/из FP 

раз ты знаешь хитрую инструкцию not то должен бы знать еще cdq, movzx\movsx, и прочие инструкции приведения типа

Автор: J0ker 18.4.2009, 20:39
Цитата(GoldFinch @ 18.4.2009,  10:12)
Цитата(J0ker @  18.4.2009,  09:02 Найти цитируемый пост)
а приведение типов - это вообще функция компилятора - в выполняемом коде никаких приведений типов нет, кроме как в/из FP 

раз ты знаешь хитрую инструкцию not то должен бы знать еще cdq, movzx\movsx, и прочие инструкции приведения типа

в C++ нет типов "byte" "word" "doubleword" и "quadword"
операции процессора не имеют никакого отношения к типам C++
приспособление операций процессора для реализации расширения/обрезания типов С++ согласно стандарту - функция компилятора
подгонка некоторых операций процессора под распространенный стандарт - не более чем фича конкретного процессора

Автор: GoldFinch 18.4.2009, 20:48
J0ker, а че ты тогда который пост пишешь про "ассемблерную  операцию not"

Автор: J0ker 18.4.2009, 20:50
Цитата(GoldFinch @ 18.4.2009,  20:48)
J0ker, а че ты тогда который пост пишешь про "ассемблерную  операцию not"

а почему я не должен про нее писать?  smile 

Автор: mes 19.4.2009, 00:07
Цитата(GoldFinch @  18.4.2009,  19:48 Найти цитируемый пост)
а че ты тогда который пост пишешь про "ассемблерную  операцию not" 

ну эта операция совсем не ассемблерная, она относится к двоичной математике, как и операции and, or и другие.
и потому выражение 
Цитата(J0ker @  18.4.2009,  07:02 Найти цитируемый пост)
практически у любого процессора есть операция not 

несет смысл того, что процессор наверняка имеет готовую реализацию для 
Цитата(J0ker @  18.4.2009,  07:02 Найти цитируемый пост)
основополагающих операций
 двоичной логики,
а не то, что Сpp-ная ~ обязательно заменяется ассемблерной not.

и была сказана в противовес утверждению inside_pointera, о том что компилятор должен реализовывать ее посредством вышеупомянутых преобразований с вычитанием..

Цитата(GoldFinch @  18.4.2009,  09:12 Найти цитируемый пост)
то должен бы знать еще cdq, movzx\movsx,

С какого перепугу человек, знакомый с двоичной математикой, должен быть знаком с ассемблером ?!

Автор: Lazin 19.4.2009, 00:14
эта тема не умрет никогда!

Автор: Anikmar 19.4.2009, 00:46
Цитата(Lazin @  19.4.2009,  00:14 Найти цитируемый пост)
эта тема не умрет никогда! 

 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)