![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
rthsobakas |
|
|||
Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 562 Регистрация: 20.9.2007 Репутация: нет Всего: -1 |
Что означает эта запись?
UINT64 id; id=id<<1; and UINT64 v; v=v>>6; То есть не совсем ясно сущность >> в данном случае |
|||
|
||||
X-3R1 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 28.4.2007 Репутация: 1 Всего: 2 |
смещение влево на один бит, и вправо на 6 бит
|
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
rthsobakas |
|
|||
Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 562 Регистрация: 20.9.2007 Репутация: нет Всего: -1 |
X-3R1, сдвиг какой? циклический арифметический? То есть сдвигает и нули пишет или переносит бит?
|
|||
|
||||
zim22 |
|
||||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
а вы сами не можете проверить?
Это сообщение отредактировал(а) zim22 - 11.4.2009, 20:58 |
||||
|
|||||
inside_pointer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
ничо не переносит, просто сдвигает и всё (слева будет ставить бит знака, а справа нули) есть разница между signed и unsigned, у unsigned бит знака ноль, а у signed может быть ноль, а может быть еденица, что там стоит, то и будет ставиться Это сообщение отредактировал(а) inside_pointer - 12.4.2009, 00:32 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
inside_pointer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
да есть он, просто он нулю равен всё время
update: иначе как она определяет signed там или unsigned и чем заполнять Это сообщение отредактировал(а) inside_pointer - 12.4.2009, 04:36 |
|||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 20 Всего: 121 |
На этапе компиляции определяет набор команд и действий. -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
inside_pointer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
для signed сдвиг зависит от компилятора, может заменять слева знаковым битом, а может другим
почему unsigned - положительное число ? если компилятор знает про знак, как он его определяет у unsigned ? я думаю там стоит ноль где-то |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
||||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
inside_pointer
нету у unsigned знакового бита, т.е. сам бит есть, но он не используется для хранения знака и не для хранения просто нуля. А для того чтобы хранить больше данных, т.е. использовать знаковый бит для хранения числа.
|
|||
|
||||
inside_pointer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
понимаешь, он может ноль слева ставить просто так, для всех, а может для знаковых ставить знаковый бит, и, вот, если он для знаковых ставит знаковый бит, то почему он для беззнаковых не ставит знаковый бит (ну который всегда равен нулю) ?
если сравнить число unsigned с нулём, почему оно больше ? |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
|
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
нету никакого знакового бита в целых числах,
то что старший разряд отрицательного целого числа равен 1, это не говорит о том что это знаковый бит если бы в целых числах использовался знаковый бит, то int(-1) было бы 0x80000001, а не 0xFFFFFFFF и операция отрицания выглядела бы как "x=x xor 0x80000000" а не "x=(not x)+1 " знаковый бит используется в вещественных числах, там действительно изменение 1 разряда меняет знак числа, и там есть +0 и -0 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
выбор операции зависит от типа аргументов.. т.е для разных типов вызываются разные реализации операторов, не смотря на то что имя у них одинаковое. потому что так интерпретируется значение. вот пример разной интерпретации одного и того же значения в зависимости от типа :
в данном примере тот бит который считается знаковым у signed, у unsigned равен 1, но никак не влияет на знак ![]() |
|||
|
||||
inside_pointer |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
ноль - это частный случай, а если у signed int сдвигать ноль вправо и будет система, где ставится знаковый бит, интересно что будет ставиться |
||||
|
|||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
почему бы тогда явно не выставлять 0/1? |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
при нуле у signed(также как и unsigned) все биты, в том числе и знаковый равны нулю и как следствие куда бы не сдвигали, все равно будет 0. А если поставите в старший ("знаковый") бит единицу, то это уже будет не ноль (и у signed, и у unsigned), а конкретное его значение будет зависеть от разрядности, так для 8ми разрядов signed будет интерпретироваться как -128, а unsigned как 128. Это сообщение отредактировал(а) mes - 12.4.2009, 17:40 |
|||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
бредить изволите не зависит это от компилятора это зависит от представления отрицательных чисел в текущей общепринятой системе целочисленные отрицательные представлены выставленным старшим битом при сдвиге знаковый бит копируется - т.е. 10000000 >> 1 = 11000000; 100000000 >> 5 = 11111100 - что соответствует делению на 2^n |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Дополняю: При сдвиге вправо копируется знаковый бит. Для signed 1 (если отрицательное) Для unsigned, соответственно, копируется 0 Это сообщение отредактировал(а) Anikmar - 13.4.2009, 09:07 |
|||
|
||||
inside_pointer |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
короче, для signed сдвиг зависим, он может заполняться нулями, а может знаковым битом ноль или один а от чего это зависит, чем он заполняется просто нулями или знаковым битом, не от компилятора ? Anikmar, ноль или один, зависит от того, чему равен знаковый бит. mes, Наверное, всё таки, для unsigned он выставляет простые нули... но как тогда быть когда компилятор выставляется слева знаковый бит ? проще же считать, что, раз знак положительный, то и знаковый бит равен нулю Добавлено через 3 минуты и 3 секунды
так оно бывает по-разному, может явно выставляться, а может по знаковому биту, вот когда знаковый бит выставляется, что происходит с unsigned, она просто нули выставляет и обрабатывает сдвиг двумя методами, или она обрабатывает одним методом и знает про знак unsigned и из него понимает этот знаковый бит ? |
||||
|
|||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
я имел ввиду другое. вы ведь можете наложить на число битовую маску и добиться того, что необходимые разряды 100% будут установлены в 0 или 1. |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
||||
|
||||
Cheloveck |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 3 Всего: 32 |
изучаем результаты, закрываем тему и не позоримся))) -------------------- ![]() |
||||
|
|||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Разница для знаковых и беззнаковых при сдвиге вправо я так понимаю обусловлена тем, что сдвиг вправо заменяет операцию деления на 2. Если бы для отрицательных знаковый бит не копировался - отрицательные числа считались бы неправильно.
|
|||
|
||||
J0ker |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
исправляю при сдвиге вправо для signed копируется знаковый бит для unsugned ничего не копируется, а просто заполняется нулями (т.е. в C/C++ сдвиг не циклический и циклического нет) Добавлено @ 09:19
ничего ни от чего не зависим - заполняется всегда знаковым битом - это соответствует делению на 2^n - как и должно быть, т.е. 10000000b == -128; 11000000b == -64; 11100000 == -32
нет естественно от представления для одной и той-же платформы любой компилятор обязан генерировать инструкции именно для получения такого результата и никакого другого Это сообщение отредактировал(а) J0ker - 13.4.2009, 09:24 |
||||||
|
|||||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
||||
|
||||
UnrealMan |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
минус 0.5 (потому что я сегодня добрый ![]()
|
||||
|
|||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Уточнение - не совсем соответствует: (-1/2) == 0 but (-1 >> 1) == -1 |
|||
|
||||
J0ker |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
оппа вот это жопа впрочем, правильно два моих утверждения противоречат друг другу... остановимся на "от представления" ![]() Добавлено через 4 минуты и 45 секунд
Уточнение - совсем соответствует вы не в ту сторону округляете рассмотрите пример любого нечетного |
||||
|
|||||
xvr |
|
||||||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Это не я округляю, это компилятор:
Это сообщение отредактировал(а) xvr - 13.4.2009, 16:43 |
||||||||||||
|
|||||||||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
xvr, вы не поняли
округление в сторону ближайшего меньшего -5/2 = -3 -7/2 = -4 -1/2 = -1 никаких исключений |
|||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
mes, , вы не поняли
округление в сторону ближайшего меньшего -5/2 = -3 -7/2 = -4 -1/2 = -1 никаких исключений ![]() |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
при -1 / 2^666 ближайшее меньшее будет -1 ?! |
|||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
ну дык mes, вы тУпите? ![]() |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ага парюсь.. сбила формулировка воспринял как в сторону ближайшего, а про меньшее забыл ![]() |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Жаль, что компиляторы С/С++ не в курсе, и округляют к 0 ![]() |
|||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
здесь обсуждается не деление, а сдвиг я вам указую, что никаких исключений при сдвиге нет - ни у positive/negative signed ни у unsigned - и там и там в текущем представлении сдвиг в право на один бит эквивалентен делению на 2 с округлением к меньшему ![]() |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
![]() |
|||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
mes,
а где я здесь говорю про округление? или как-то привязываю соответствующее сдвигу деление к реализации оного где- и чем-либо? не выдавайте пжалста свои фантазии за мои слова ![]() |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
думал две цитаты обойдутся без коммента..Исправляюсь : Я привел их к тому, что Вы оба говорите об одном и том же, но с разных сторон и причины для спора лично я не вижу ![]() т.е для полной картины надо обе ваши фразы объединить , типа этого:
Это сообщение отредактировал(а) mes - 14.4.2009, 01:58 |
||||
|
|||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Полностью согласен. 2 J0ker - консенсус? ![]() |
||||
|
|||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
||||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
||||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
ну если вы все свои проблемы решили, то почему-бы и нет ![]() |
|||
|
||||
RaP1D |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 12.10.2008 Репутация: нет Всего: нет |
Дабы не создавать новой темы, задам вопрос сюда...
Итак, что означает следующая запись:
Если с командой & все понятно, то что означает *(int*)? |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
RaP1D
Да, действительно..давайте все вопросы сюда постить. Подождите, у меня вчера стиральная машина ошибку выдавала..
причем тут эта тема? она битовых смещений касалась. |
|||
|
||||
RaP1D |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 12.10.2008 Репутация: нет Всего: нет |
azesmcar, не в этом дело
![]() Просто название темы "Что означает эта запись?" и чтоб не создавать такой-же я решил сюда... ![]() |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
RaP1D
Надо..надо новую тему создавать ![]() это приведение к тиму в стиле С, и разименовка
|
|||
|
||||
RaP1D |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 12.10.2008 Репутация: нет Всего: нет |
azesmcar, буду знать, спасибо!
![]() |
|||
|
||||
inside_pointer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
да, и что же понятно ? тебе понятно, что она берёт адрес байта, который в x'е четвёртый по счёту (например), потом к этому адресу применяет операцию приведения к типу адреса с другим выравниванием, а потом уже полученное разыменовывает (не просто адрес, а тот же самый адрес, только который указывает на начало объекта другого размера (ну там совпадёт, что тоже четыре байта объект, но ты попробуй привести его к (char *) и поймёшь, что при разыменовании объект будет читаться как будто он весь в одном байте, когда float в четырёх) там битовое представление хранится в этих байтах непрерывно и значение вычисляется из него |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |