![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
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 (потому что я сегодня добрый ![]()
|
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |