Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Как работает макрос? |
Автор: Alca 16.4.2009, 16:07 | ||
Объясните как работает этот макрос.
Добавлено через 1 минуту и 6 секунд Что за (~0)? |
Автор: Lazin 16.4.2009, 16:14 |
оператор ~ |
Автор: Alca 16.4.2009, 16:29 | ||
а чего он делает? |
Автор: J0ker 16.4.2009, 16:33 | ||||
абалдеть ![]() |
Автор: mes 16.4.2009, 16:33 |
операция NOT - инвертирует биты, для signed типов ~0 == -1 |
Автор: Alca 16.4.2009, 16:34 | ||
![]() Добавлено через 57 секунд Объясните как работает этот макрос. ![]() |
Автор: 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 | ||||||
x0, x1, x2, x3, x4 равны - 1; (VC++ 2008, WinXP 32 bit) Добавлено через 12 минут
![]() |
Автор: vinter 17.4.2009, 10:02 |
Alca, это ты к чему? |
Автор: Alca 17.4.2009, 10:07 | ||
Мне был интересен конечный результат оператора ~. |
Автор: inside_pointer 17.4.2009, 11:21 | ||
то есть она, чтобы обратить биты у знакового, переводит его в беззнаковый, вычитает из максимального беззнакового число, а потом результат переводит в знаковый обратно Добавлено через 4 минуты и 16 секунд а SOCKET, если ты под виндой, то там для хендлов чаще используются unsigned long'и то есть, если это так, то потом знаковый при присваивании будет приводиться к беззнаковому |
Автор: Rickert 17.4.2009, 12:00 |
~ - оператор инверсии битов. Если взять число, для которого он применён, в двоичной форме, то все 0 меняются на 1, а 1 на 0. А (SOCKET) - это приведение типов. |
Автор: zim22 17.4.2009, 12:06 |
вы этот код сами придумали? |
Автор: Alca 17.4.2009, 12:07 | ||||
тогда x0 должно быть 1
|
Автор: Lazin 17.4.2009, 12:12 |
почему? Добавлено через 50 секунд я знаю чему оно должно быть равно, просто мне интересен ход мыслей, который мог привести к этому выводу )) |
Автор: Alca 17.4.2009, 12:18 | ||||||
Типа так должно быть (в двоичной)? 0000 -> 1111 Добавлено через 1 минуту и 40 секунд http://ru.wikipedia.org/wiki/Битовые_операции Добавлено через 2 минуты и 6 секунд
Добавлено через 4 минуты
Чему? |
Автор: zim22 17.4.2009, 12:26 | ||
Alca, а вы так попробуйте
|
Автор: Alca 17.4.2009, 12:34 | ||||||||||
|
Автор: zim22 17.4.2009, 12:43 | ||
всё правильно. так и должно быть. поверьте, компилятор вас не дурит ![]()
|
Автор: inside_pointer 17.4.2009, 15:30 | ||
там неявные приведения типов, и он не инверсирует биты, а проводит вот такую операцию вычитания из большего значения это последовательность того, как происходит операция ![]() похожее происходит при операции одноместного минуса |
Автор: inside_pointer 17.4.2009, 15:50 | ||
в чём ? 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 | ||
правда??????????? а я-то наивный думал, что для численных констант это compile time инвертирование, а для переменных - ассемблерная операция not inside_pointer, ты хоть фантазируй более правдоподобно, чтоль... |
Автор: vinter 17.4.2009, 17:11 | ||
чем проще конструкция, тем у большего количества людей есть свои мнения ![]() |
Автор: inside_pointer 17.4.2009, 18:03 | ||
а что это меняет ? |
Автор: J0ker 17.4.2009, 20:24 |
уменьшает расход электоэнергии причем на обоих этапах - компиляции и выполнения ![]() |
Автор: GoldFinch 17.4.2009, 20:48 |
в который раз удивляюсь как программисты могут обсуждать такие тривиальные вещи представление данных и работа с ними - это же азы информатики, все программисты должны это знать %) |
Автор: J0ker 18.4.2009, 00:16 | ||
где вы тут программистов-то увидели? тут только ламеры да джедаи ![]() |
Автор: Anikmar 18.4.2009, 00:25 |
![]() Тут только ламеры, джедаи, J0ker и GoldFinch. ![]() |
Автор: J0ker 18.4.2009, 00:39 | ||
потому, что GoldFinch - джедай ![]() |
Автор: inside_pointer 18.4.2009, 03:23 | ||
вот именно, потому и знать это не надо, так как это не стандарт, компиляторов-то много, а стандарт один |
Автор: J0ker 18.4.2009, 08:02 | ||||
вы для начала откомпилируйте и посмотрите в стандарте дано описание поведения этого оператора, но на самом деле такого бреда естественно не происходит - никакого вычитания там нет - практически у любого процессора есть операция not - это одна из основополагающих операций, а приведение типов - это вообще функция компилятора - в выполняемом коде никаких приведений типов нет, кроме как в/из FP |
Автор: inside_pointer 18.4.2009, 08:37 | ||
а, ну ясно тогда |
Автор: GoldFinch 18.4.2009, 10:12 | ||
раз ты знаешь хитрую инструкцию not то должен бы знать еще cdq, movzx\movsx, и прочие инструкции приведения типа |
Автор: J0ker 18.4.2009, 20:39 | ||||
в C++ нет типов "byte" "word" "doubleword" и "quadword" операции процессора не имеют никакого отношения к типам C++ приспособление операций процессора для реализации расширения/обрезания типов С++ согласно стандарту - функция компилятора подгонка некоторых операций процессора под распространенный стандарт - не более чем фича конкретного процессора |
Автор: GoldFinch 18.4.2009, 20:48 |
J0ker, а че ты тогда который пост пишешь про "ассемблерную операцию not" |
Автор: J0ker 18.4.2009, 20:50 | ||
а почему я не должен про нее писать? ![]() |
Автор: mes 19.4.2009, 00:07 | ||
ну эта операция совсем не ассемблерная, она относится к двоичной математике, как и операции and, or и другие. и потому выражение несет смысл того, что процессор наверняка имеет готовую реализацию для двоичной логики, а не то, что Сpp-ная ~ обязательно заменяется ассемблерной not. и была сказана в противовес утверждению inside_pointera, о том что компилятор должен реализовывать ее посредством вышеупомянутых преобразований с вычитанием.. С какого перепугу человек, знакомый с двоичной математикой, должен быть знаком с ассемблером ?! |
Автор: Lazin 19.4.2009, 00:14 |
эта тема не умрет никогда! |
Автор: Anikmar 19.4.2009, 00:46 |
![]() |