Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Что означает эта запись? 
:(
    Опции темы
mes
Дата 12.4.2009, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(inside_pointer @  12.4.2009,  10:01 Найти цитируемый пост)
то почему он для беззнаковых не ставит знаковый бит (

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

Цитата(inside_pointer @  12.4.2009,  10:01 Найти цитируемый пост)
если сравнить число unsigned с нулём, почему оно больше ? 

потому что так интерпретируется значение.
вот пример разной интерпретации одного и того же значения в зависимости от типа :
Код

 std::cout << (signed short)  (0xFFFF) << std::endl;
 std::cout << (unsigned short)(0xFFFF) << std::endl;

в данном примере  тот бит который считается знаковым у signed, у unsigned равен 1, но никак не влияет на знак  smile 



--------------------
PM MAIL WWW   Вверх
inside_pointer
Дата 12.4.2009, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



Цитата(zim22)

Код

    unsigned int i = 0;



ноль - это частный случай, а если у signed int сдвигать ноль вправо и будет система, где ставится знаковый бит, интересно что будет ставиться
PM MAIL   Вверх
zim22
Дата 12.4.2009, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(inside_pointer @  12.4.2009,  11:24 Найти цитируемый пост)
 интересно что будет ставиться

почему бы тогда явно не выставлять 0/1?


--------------------
PM MAIL   Вверх
Anikmar
Дата 12.4.2009, 11:41 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



PM MAIL ICQ   Вверх
mes
Дата 12.4.2009, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(inside_pointer @  12.4.2009,  10:24 Найти цитируемый пост)
ноль - это частный случай, а если у signed int сдвигать ноль вправо и будет система, где ставится знаковый бит, интересно что будет ставиться 

при нуле у signed(также как и unsigned) все биты, в том числе и знаковый равны нулю и как следствие куда бы не сдвигали, все равно будет 0.
А если поставите в старший ("знаковый") бит единицу, то это уже будет не ноль (и у signed, и у unsigned), а конкретное его значение будет зависеть от разрядности,
так для 8ми разрядов signed будет интерпретироваться как -128, а unsigned как 128.



Это сообщение отредактировал(а) mes - 12.4.2009, 17:40


--------------------
PM MAIL WWW   Вверх
J0ker
Дата 13.4.2009, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



Цитата(inside_pointer @  12.4.2009,  06:17 Найти цитируемый пост)
для signed сдвиг зависит от компилятора, может заменять слева знаковым битом, а может другим

бредить изволите
не зависит это от компилятора
это зависит от представления отрицательных чисел
в текущей общепринятой системе целочисленные отрицательные представлены выставленным старшим битом
при сдвиге знаковый бит копируется - т.е. 10000000 >> 1 = 11000000; 100000000 >> 5 = 11111100 - что соответствует делению на 2^n



--------------------
user posted image
PM MAIL   Вверх
Anikmar
Дата 13.4.2009, 07:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(J0ker @  13.4.2009,  00:02 Найти цитируемый пост)
при сдвиге знаковый бит копируется - т.е. 10000000 >> 1 = 11000000; 100000000 >> 5 = 11111100 - что соответствует делению на 2^n

Дополняю:
При сдвиге вправо копируется знаковый бит.
Для signed 1 (если отрицательное)
Для unsigned, соответственно, копируется 0

Это сообщение отредактировал(а) Anikmar - 13.4.2009, 09:07
PM MAIL ICQ   Вверх
inside_pointer
Дата 13.4.2009, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



Цитата(J0ker)

бредить изволите
не зависит это от компилятора
это зависит от представления отрицательных чисел

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

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

mes,
Наверное, всё таки, для unsigned он выставляет простые нули... но как тогда быть когда компилятор выставляется слева знаковый бит ? проще же считать, что, раз знак положительный, то и знаковый бит равен нулю

Добавлено через 3 минуты и 3 секунды
Цитата(zim22)

почему бы тогда явно не выставлять 0/1? 

так оно бывает по-разному, может явно выставляться, а может по знаковому биту, вот когда знаковый бит выставляется, что происходит с unsigned, она просто нули выставляет и обрабатывает сдвиг двумя методами, или она обрабатывает одним методом и знает про знак unsigned и из него понимает этот знаковый бит ?
PM MAIL   Вверх
zim22
Дата 13.4.2009, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(inside_pointer @  13.4.2009,  08:40 Найти цитируемый пост)
так оно бывает по-разному, может явно выставляться

я имел ввиду другое. вы ведь можете наложить на число битовую маску и добиться того, что необходимые разряды 100% будут установлены в 0 или 1.


--------------------
PM MAIL   Вверх
Anikmar
Дата 13.4.2009, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(inside_pointer @  13.4.2009,  08:40 Найти цитируемый пост)
Anikmar, ноль или один, зависит от того, чему равен знаковый бит.

Ага, я уже уточнил.  smile 
PM MAIL ICQ   Вверх
Cheloveck
Дата 13.4.2009, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 3
Всего: 32



Код

#include <iostream>
#include <conio.h>
#include <stdlib.h>
using namespace std;

int main(int argc, char **argv)
{
    char buffer[33];
    unsigned int a = 0xFFFFFFFF;
    itoa(a, buffer, 2);
    cout << "unsigned int before shift = " << a << "\t" << buffer << endl;
    itoa(a >>= 1, buffer, 2);
    cout << "unsigned int after shift = " << a << "\t" << buffer << endl;
    signed int b = 0xFFFFFFFF;
    itoa(b, buffer, 2);
    cout << "signed int before shift = " << b << "\t" << buffer << endl;
    itoa(b >>= 1, buffer, 2);
    cout << "signed int after shift = " << b << "\t" << buffer << endl;
    getch();
    return 0;
}

Код

unsigned int before shift = 4294967295  11111111111111111111111111111111
unsigned int after shift = 2147483647   1111111111111111111111111111111
signed int before shift = -1    11111111111111111111111111111111
signed int after shift = -1     11111111111111111111111111111111

изучаем результаты, закрываем тему и не позоримся)))


--------------------
user posted image
PM Jabber   Вверх
Anikmar
Дата 13.4.2009, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Разница для знаковых и беззнаковых при сдвиге вправо я так понимаю обусловлена тем, что сдвиг вправо заменяет операцию деления на 2. Если бы для отрицательных знаковый бит не копировался - отрицательные числа считались бы неправильно.
PM MAIL ICQ   Вверх
J0ker
Дата 13.4.2009, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



Цитата(Anikmar @  13.4.2009,  07:27 Найти цитируемый пост)
Дополняю:
При сдвиге вправо копируется знаковый бит.
Для signed 1 (если отрицательное)
Для unsigned, соответственно, копируется 0

исправляю
при сдвиге вправо для signed копируется знаковый бит
для unsugned ничего не копируется, а просто заполняется нулями (т.е. в C/C++ сдвиг не циклический и циклического нет)

Добавлено @ 09:19
Цитата(inside_pointer @  13.4.2009,  08:40 Найти цитируемый пост)
короче, для signed сдвиг зависим, он может заполняться нулями, а может знаковым битом ноль или один

ничего ни от чего не зависим - заполняется всегда знаковым битом - это соответствует делению на 2^n - как и должно быть, т.е. 10000000b == -128; 11000000b == -64; 11100000 == -32

Цитата(inside_pointer @  13.4.2009,  08:40 Найти цитируемый пост)
а от чего это зависит, чем он заполняется просто нулями или знаковым битом, не от компилятора ?

нет естественно
от представления
для одной и той-же платформы любой компилятор обязан генерировать инструкции именно для получения такого результата и никакого другого


Это сообщение отредактировал(а) J0ker - 13.4.2009, 09:24


--------------------
user posted image
PM MAIL   Вверх
Anikmar
Дата 13.4.2009, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(J0ker @  13.4.2009,  09:14 Найти цитируемый пост)
исправляю
при сдвиге вправо для signed копируется знаковый бит
для unsugned ничего не копируется, а просто заполняется нулями (т.е. в C/C++ сдвиг не циклический и циклического нет)

Именно это я и имел в виду. Как та собака - все понимает а сказать не может  smile 
PM MAIL ICQ   Вверх
UnrealMan
Дата 13.4.2009, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(J0ker @  13.4.2009,  09:14 Найти цитируемый пост)
ничего ни от чего не зависим - заполняется всегда знаковым битом - это соответствует делению на 2^n - как и должно быть

минус 0.5 (потому что я сегодня добрый smile)

Цитата(5.8 Shift operators)
The value of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type or if E1 has a signed type and a nonnegative value, the value of the result is the integral part of the quotient of E1 divided by the quantity 2 raised to the power E2. If E1 has a signed type and a negative value, the resulting value is implementation-defined.

PM MAIL   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1224 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.