Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 04.02.2011, 09:19   #1
Tahoma
DI HALT RET
Форумчанин
 
Аватар для Tahoma
 
Регистрация: 30.12.2010
Сообщений: 117
По умолчанию Double to __int64

Здравствуйте знатоки.
Столкнулся с такой проблемой:
Необходимо написать аналогичную прогу, по проге явы. Т.е. есть декомпиленый исходник явы, а пишу я на MS VC++. Проблема же заключается в переводе double в int64 формат, чтобы потом запихнуть это дело в пакет и отправить серверу.
Код явы:
Код:
         this.base = new byte[this.size - 4];
         long tmp = Double.doubleToLongBits(data);
         this.base[7] = (byte)((int)(tmp & 255L));
         tmp >>= 8;
         this.base[6] = (byte)((int)(tmp & 255L));
         tmp >>= 8;
         this.base[5] = (byte)((int)(tmp & 255L));
         tmp >>= 8;
         this.base[4] = (byte)((int)(tmp & 255L));
         tmp >>= 8;
         this.base[3] = (byte)((int)(tmp & 255L));
         tmp >>= 8;
         this.base[2] = (byte)((int)(tmp & 255L));
         tmp >>= 8;
         this.base[1] = (byte)((int)(tmp & 255L));
         tmp >>= 8;
         this.base[0] = (byte)((int)(tmp & 255L));
В принципе ничего сложного. Получаем long из double и пихаем в буфер.

Делаю тоже самое на С++ или просто:
Код:
double old = 50;
long new = old;
Естественно у меня и получается просто 50, т.е. 0x32. Когда на яве получается 0x4940. Как так?
На яве перевернутое: 0x40490000 00000000

Где то я ошибочку допустил или как то переводится по другому?
Помогите решить.

Пробовал методом тыка выяснить как он хранит. Сделал 0x4a40 и получил число 52

p.s.: порылся в msdn и нашел функцию :
Код:
public:
static long long DoubleToInt64Bits(
	double value
)
Но компилятор у меня её не скушал (не стандарт значит), а т.к. я только начал учится писать кроссплатформ, то опасаюсь что-либо лишнего добавлять


Спасибо

Последний раз редактировалось Tahoma; 04.02.2011 в 11:29.
Tahoma вне форума Ответить с цитированием
Старый 04.02.2011, 12:11   #2
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

1) Конвертируй при помощи static_cast. Приведение типов в стиле C это плохо.
Приведение типов в стиле C плохо по следующим причинам. Во-первых, это может быть static_cast, reinterpret_cast, и const_cast (или несколько одновременно). Мало того, C-style cast может положить программу во время рантайма в том случае, когда на плохой C++ каст компилятор ругнулся бы при компиляции (например, при касте в приватного предка). В-третьих, C-style cast сложнее искать в исходнике, что автоматически, что глазами.
2) Используй int32_t/int64_t. У них размер гарантирован, в отличие от long long и т.п.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su

Последний раз редактировалось Obey-Kun; 04.02.2011 в 12:21.
Obey-Kun вне форума Ответить с цитированием
Старый 04.02.2011, 13:18   #3
Tahoma
DI HALT RET
Форумчанин
 
Аватар для Tahoma
 
Регистрация: 30.12.2010
Сообщений: 117
По умолчанию

Даже со static_cast число 50 по любому равно 0x32. Почему же в яве получается 0x4940? Может все дело в функции doubleToLongBits? Есть ли пример какой-нибудь как её использовать? Точнее как ей пользоваться я в msdn нашел, но какую библиотеку подгрузить, чтобы её компилятор видел не знаю

Цитата:
Сообщение от Obey-Kun Посмотреть сообщение
1) Конвертируй при помощи static_cast. Приведение типов в стиле C это плохо.
Приведение типов в стиле C плохо по следующим причинам. Во-первых, это может быть static_cast, reinterpret_cast, и const_cast (или несколько одновременно). Мало того, C-style cast может положить программу во время рантайма в том случае, когда на плохой C++ каст компилятор ругнулся бы при компиляции (например, при касте в приватного предка). В-третьих, C-style cast сложнее искать в исходнике, что автоматически, что глазами.
2) Используй int32_t/int64_t. У них размер гарантирован, в отличие от long long и т.п.
Не вижу кнопочку спасибо, ткнул бы раз 10!
Спасибо, что подсказал. Ошибка и правда затоилась в неправельном переводе из double в int(long). Сделал без перевода. Просто дописал кусочек кода, чтобы сразу double число пихало в пакет... и ура

Последний раз редактировалось Stilet; 04.02.2011 в 15:49.
Tahoma вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
E2015 Ambiguity between 'std::log(double)' and 'std::log(long double)' Namolem Помощь студентам 3 02.04.2011 20:22
функция pow(double x, double y) Не могу понять в чем ошибка Vlashel Помощь студентам 3 07.10.2010 16:28
String to double ? NiCola999 Общие вопросы C/C++ 3 14.03.2010 13:21
long double vs. double VoidMan Общие вопросы C/C++ 1 21.09.2009 18:45
Double/? Viteef Общие вопросы Delphi 6 25.07.2007 02:28