| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Что означает эта запись? |
| Автор: rthsobakas 11.4.2009, 20:16 |
| Что означает эта запись? UINT64 id; id=id<<1; and UINT64 v; v=v>>6; То есть не совсем ясно сущность >> в данном случае |
| Автор: X-3R1 11.4.2009, 20:21 |
| смещение влево на один бит, и вправо на 6 бит |
| Автор: azesmcar 11.4.2009, 20:22 |
| rthsobakas было уже http://forum.vingrad.ru/forum/topic-252868/hl/index.html |
| Автор: rthsobakas 11.4.2009, 20:44 |
| X-3R1, сдвиг какой? циклический арифметический? То есть сдвигает и нули пишет или переносит бит? |
| Автор: inside_pointer 12.4.2009, 00:10 | ||
ничо не переносит, просто сдвигает и всё (слева будет ставить бит знака, а справа нули) есть разница между signed и unsigned, у unsigned бит знака ноль, а у signed может быть ноль, а может быть еденица, что там стоит, то и будет ставиться |
| Автор: mes 12.4.2009, 01:58 | ||
у unsigned нет знакового бита |
| Автор: inside_pointer 12.4.2009, 04:19 |
| да есть он, просто он нулю равен всё время update: иначе как она определяет signed там или unsigned и чем заполнять |
| Автор: W4FhLF 12.4.2009, 05:45 | ||
На этапе компиляции определяет набор команд и действий. |
| Автор: inside_pointer 12.4.2009, 06:17 |
| для signed сдвиг зависит от компилятора, может заменять слева знаковым битом, а может другим почему unsigned - положительное число ? если компилятор знает про знак, как он его определяет у unsigned ? я думаю там стоит ноль где-то |
| Автор: zim22 12.4.2009, 06:59 |
а вы сами http://forum.vingrad.ru/index.php?showtopic=254517&view=findpost&p=1836446 |
| Автор: azesmcar 12.4.2009, 10:52 | ||
| inside_pointer нету у unsigned знакового бита, т.е. сам бит есть, но он не используется для хранения знака и не для хранения просто нуля. А для того чтобы хранить больше данных, т.е. использовать знаковый бит для хранения числа.
|
| Автор: inside_pointer 12.4.2009, 11:01 |
| понимаешь, он может ноль слева ставить просто так, для всех, а может для знаковых ставить знаковый бит, и, вот, если он для знаковых ставит знаковый бит, то почему он для беззнаковых не ставит знаковый бит (ну который всегда равен нулю) ? если сравнить число unsigned с нулём, почему оно больше ? |
| Автор: zim22 12.4.2009, 11:08 | ||
|
| Автор: GoldFinch 12.4.2009, 11:16 |
| нету никакого знакового бита в целых числах, то что старший разряд отрицательного целого числа равен 1, это не говорит о том что это знаковый бит если бы в целых числах использовался знаковый бит, то int(-1) было бы 0x80000001, а не 0xFFFFFFFF и операция отрицания выглядела бы как "x=x xor 0x80000000" а не "x=(not x)+1 " знаковый бит используется в вещественных числах, там действительно изменение 1 разряда меняет знак числа, и там есть +0 и -0 |
| Автор: mes 12.4.2009, 11:17 | ||
выбор операции зависит от типа аргументов.. т.е для разных типов вызываются разные реализации операторов, не смотря на то что имя у них одинаковое. потому что так интерпретируется значение. вот пример разной интерпретации одного и того же значения в зависимости от типа :
в данном примере тот бит который считается знаковым у signed, у unsigned равен 1, но никак не влияет на знак |
| Автор: inside_pointer 12.4.2009, 11:24 | ||||
ноль - это частный случай, а если у signed int сдвигать ноль вправо и будет система, где ставится знаковый бит, интересно что будет ставиться |
| Автор: zim22 12.4.2009, 11:30 |
почему бы тогда явно не выставлять 0/1? |
| Автор: Anikmar 12.4.2009, 11:41 |
| inside_pointer, http://kuzelenkov.narod.ru/mati/book/inform/inform5.html |
| Автор: mes 12.4.2009, 11:44 | ||
при нуле у signed(также как и unsigned) все биты, в том числе и знаковый равны нулю и как следствие куда бы не сдвигали, все равно будет 0. А если поставите в старший ("знаковый") бит единицу, то это уже будет не ноль (и у signed, и у unsigned), а конкретное его значение будет зависеть от разрядности, так для 8ми разрядов signed будет интерпретироваться как -128, а unsigned как 128. |
| Автор: J0ker 13.4.2009, 00:02 | ||
бредить изволите не зависит это от компилятора это зависит от представления отрицательных чисел в текущей общепринятой системе целочисленные отрицательные представлены выставленным старшим битом при сдвиге знаковый бит копируется - т.е. 10000000 >> 1 = 11000000; 100000000 >> 5 = 11111100 - что соответствует делению на 2^n |
| Автор: Anikmar 13.4.2009, 07:27 | ||
Дополняю: При сдвиге вправо копируется знаковый бит. Для signed 1 (если отрицательное) Для unsigned, соответственно, копируется 0 |
| Автор: inside_pointer 13.4.2009, 08:40 | ||||
короче, для signed сдвиг зависим, он может заполняться нулями, а может знаковым битом ноль или один а от чего это зависит, чем он заполняется просто нулями или знаковым битом, не от компилятора ? Anikmar, ноль или один, зависит от того, чему равен знаковый бит. mes, Наверное, всё таки, для unsigned он выставляет простые нули... но как тогда быть когда компилятор выставляется слева знаковый бит ? проще же считать, что, раз знак положительный, то и знаковый бит равен нулю Добавлено через 3 минуты и 3 секунды
так оно бывает по-разному, может явно выставляться, а может по знаковому биту, вот когда знаковый бит выставляется, что происходит с unsigned, она просто нули выставляет и обрабатывает сдвиг двумя методами, или она обрабатывает одним методом и знает про знак unsigned и из него понимает этот знаковый бит ? |
| Автор: zim22 13.4.2009, 08:59 |
я имел ввиду другое. вы ведь можете наложить на число битовую маску и добиться того, что необходимые разряды 100% будут установлены в 0 или 1. |
| Автор: Anikmar 13.4.2009, 09:08 | ||
Ага, я уже уточнил. |
| Автор: Cheloveck 13.4.2009, 09:12 | ||||
изучаем результаты, закрываем тему и не позоримся))) |
| Автор: Anikmar 13.4.2009, 09:13 |
| Разница для знаковых и беззнаковых при сдвиге вправо я так понимаю обусловлена тем, что сдвиг вправо заменяет операцию деления на 2. Если бы для отрицательных знаковый бит не копировался - отрицательные числа считались бы неправильно. |
| Автор: J0ker 13.4.2009, 09:14 | ||||||
исправляю при сдвиге вправо для signed копируется знаковый бит для unsugned ничего не копируется, а просто заполняется нулями (т.е. в C/C++ сдвиг не циклический и циклического нет) Добавлено @ 09:19
ничего ни от чего не зависим - заполняется всегда знаковым битом - это соответствует делению на 2^n - как и должно быть, т.е. 10000000b == -128; 11000000b == -64; 11100000 == -32
нет естественно от представления для одной и той-же платформы любой компилятор обязан генерировать инструкции именно для получения такого результата и никакого другого |
| Автор: Anikmar 13.4.2009, 09:36 | ||
Именно это я и имел в виду. Как та собака - все понимает а сказать не может |
| Автор: UnrealMan 13.4.2009, 13:11 | ||||
минус 0.5 (потому что я сегодня добрый
|
| Автор: xvr 13.4.2009, 15:30 | ||
Уточнение - не совсем соответствует: (-1/2) == 0 but (-1 >> 1) == -1 |
| Автор: J0ker 13.4.2009, 16:21 | ||||
оппа вот это жопа впрочем, правильно два моих утверждения противоречат друг другу... остановимся на "от представления" Добавлено через 4 минуты и 45 секунд
Уточнение - совсем соответствует вы не в ту сторону округляете рассмотрите пример любого нечетного |
| Автор: xvr 13.4.2009, 16:41 | ||||||||||||
Это не я округляю, это компилятор:
|
| Автор: mes 13.4.2009, 16:48 |
-1>>666 == -1; |
| Автор: J0ker 13.4.2009, 16:48 |
| xvr, вы не поняли округление в сторону ближайшего меньшего -5/2 = -3 -7/2 = -4 -1/2 = -1 никаких исключений |
| Автор: J0ker 13.4.2009, 16:48 |
| mes, , вы не поняли округление в сторону ближайшего меньшего -5/2 = -3 -7/2 = -4 -1/2 = -1 никаких исключений |
| Автор: mes 13.4.2009, 16:51 |
при -1 / 2^666 ближайшее меньшее будет -1 ?! |
| Автор: J0ker 13.4.2009, 17:00 | ||
ну дык mes, вы тУпите? |
| Автор: mes 13.4.2009, 17:36 |
ага парюсь.. сбила формулировка воспринял как в сторону ближайшего, а про меньшее забыл |
| Автор: xvr 13.4.2009, 19:18 | ||
Жаль, что компиляторы С/С++ не в курсе, и округляют к 0 |
| Автор: J0ker 13.4.2009, 23:34 |
здесь обсуждается не деление, а сдвиг я вам указую, что никаких исключений при сдвиге нет - ни у positive/negative signed ни у unsigned - и там и там в текущем представлении сдвиг в право на один бит эквивалентен делению на 2 с округлением к меньшему |
| Автор: mes 14.4.2009, 00:33 | ||||||
|
| Автор: J0ker 14.4.2009, 01:17 |
| mes, а где я здесь говорю про округление? или как-то привязываю соответствующее сдвигу деление к реализации оного где- и чем-либо? не выдавайте пжалста свои фантазии за мои слова |
| Автор: mes 14.4.2009, 01:57 | ||||
думал две цитаты обойдутся без коммента..Исправляюсь : Я привел их к тому, что Вы оба говорите об одном и том же, но с разных сторон и причины для спора лично я не вижу т.е для полной картины надо обе ваши фразы объединить , типа этого:
|
| Автор: xvr 14.4.2009, 07:28 | ||||
Полностью согласен. 2 J0ker - консенсус? |
| Автор: Anikmar 14.4.2009, 07:50 |
Наливайте! |
| Автор: xvr 14.4.2009, 11:36 | ||
Запросто: Больше не дает |
| Автор: J0ker 14.4.2009, 16:28 |
ну если вы все свои проблемы решили, то почему-бы и нет |
| Автор: RaP1D 4.5.2009, 19:06 | ||
| Дабы не создавать новой темы, задам вопрос сюда... Итак, что означает следующая запись:
Если с командой & все понятно, то что означает *(int*)? |
| Автор: azesmcar 4.5.2009, 19:15 | ||
| RaP1D Да, действительно..давайте все вопросы сюда постить. Подождите, у меня вчера стиральная машина ошибку выдавала..
причем тут эта тема? она битовых смещений касалась. |
| Автор: RaP1D 4.5.2009, 19:23 |
| azesmcar, не в этом дело Просто название темы "Что означает эта запись?" и чтоб не создавать такой-же я решил сюда... |
| Автор: azesmcar 4.5.2009, 19:50 | ||
| RaP1D Надо..надо новую тему создавать это приведение к тиму в стиле С, и разименовка
|
| Автор: RaP1D 4.5.2009, 20:24 |
| azesmcar, буду знать, спасибо! |
| Автор: inside_pointer 5.5.2009, 11:57 | ||
да, и что же понятно ? тебе понятно, что она берёт адрес байта, который в x'е четвёртый по счёту (например), потом к этому адресу применяет операцию приведения к типу адреса с другим выравниванием, а потом уже полученное разыменовывает (не просто адрес, а тот же самый адрес, только который указывает на начало объекта другого размера (ну там совпадёт, что тоже четыре байта объект, но ты попробуй привести его к (char *) и поймёшь, что при разыменовании объект будет читаться как будто он весь в одном байте, когда float в четырёх) там битовое представление хранится в этих байтах непрерывно и значение вычисляется из него |