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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> (double)(1 << 32) == 0 почему, когда double 8 байт 
V
    Опции темы
Royan
  Дата 1.2.2006, 05:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


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

Репутация: нет
Всего: 15



Не могу понять, почему я не могу присвоить double число 1<<32? Я же не с интом работаю, и sizeof честно говорит 8 байт, в чем проблема?
Система WinXP home (ясное дело win32) компилирую VS2003


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
chaos
Дата 1.2.2006, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


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

Репутация: 6
Всего: 44



Цитата

побитовые операции применяются к целочисленым типам(возможно с unsigned)

Добавлено @ 07:34
и интересно почему твой компилер не дал тебе по рукам smile

Это сообщение отредактировал(а) chaos - 1.2.2006, 08:41
PM WWW   Вверх
Mayk
Дата 1.2.2006, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(Royan @ 1.2.2006, 09:31 Найти цитируемый пост)

Не могу понять, почему я не могу присвоить double число 1<<32? Я же не с интом работаю, и sizeof честно говорит 8 байт, в чем проблема?
Система WinXP home (ясное дело win32) компилирую VS2003

Код

double d = 1 << 32;

Оно не заработает. 1<<32 - это ещё int, а не double.
Решение
Код

#include <iostream>
using namespace std;
int main()
{
        double s = 1 << 32;
        cout << s << endl; //0

        s = 1LL << 32; //(1)
        cout << s << endl; //4.29497e+09

        s = 0x1p32;  //(2)
        cout << s << endl;//4.29497e+09 

}

способ (2) имхо предпочтительнее. 0x1p32 это уже float constant. а 1LL <<32 это ещё integer constant.
Добавлено @ 08:14
(0x1p32 это 1 * 2 ** 32 - это вообще фича c99, поэтому с++ компилятор может её не держать(комо в с++ стрикт не держит, в с99 держит, gnu c держит, как обстоят с этим делом дела у msvc не знаю. Но если 0x1p32 в нём есть, то это одназначно то, что нужно)).
Добавлено @ 08:18
(только long long (1LL) он тоже не стандартен строго говоря. Если 1LL вызывает ошибку, то можно что-то типа __int64(1) << 32, или __i64(1) << 32. Вообщем shift'ить нужно 64 и более битовое число)
Добавлено @ 08:20
Цитата(chaos @ 1.2.2006, 11:32 Найти цитируемый пост)

и интересно почему твой компилер не дал тебе по рукам

Он максимум что warning выдаст.
Comeau: "ComeauTest.c", line 1: warning: shift count is too large
GCC: a.cpp:7: warning: left shift count >= width of type

Это сообщение отредактировал(а) Mayk - 1.2.2006, 08:15


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Mayk
Дата 1.2.2006, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Ну или вот так ещё.
Код

        s = double(UINT_MAX) + 1;
        cout << s << endl;
        s = double(numeric_limits<unsigned int>::max()) + 1
        cout << s << endl;




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Royan
Дата 2.2.2006, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


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

Репутация: нет
Всего: 15



Mayk

Спасибо за разъяснения. Тут проблема была не в том, что мне нужно именно получить число 2^32, а в том, что я не понимал почему мне не двинуть больше четырех байт. Мысль о том, что я работаю с интом, а не с double пришла только после того как я проникся содержанием твоего сообщения smile
В силу того что сдвиг на 32 бита я привел как пример, (мне же надо лаконично записывая двигать разное число) я решил использовать __i64(1) << 32. Жаль это сводит переносимость кода только к компиляторам msvc, но пока этого хватит, потом подумаю над тем как изменить кастинг, чтобы он был понятен большему числу компиляторов


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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