Как отметил @Vovanium, вы получаете длинное длинное значение типа double, которое в вашем примере вернет -13456. Без дроби, без показателя.
В ваших операциях сдвига и маски вы приводите к int слишком рано. Вам необходимо применить приведение после смены и маски. Кроме того, обертывание в цикле уменьшает монтирование кода для изменения.
int i;
int j;
for (j = 0; j < sizeof(n); j++) {
i = (int)(n >> (j*8)) & 0x0ff;
[dataToSend appendData:[NSMutableData dataWithBytes:&i length:sizeof(i)]];
}
[self send:dataToSend];
Обратите внимание, что, согласно JavaDocs для Double , Java ожидает, что биты будут иметь определенный порядок. Вы получите неправильные значения, если приведение от long к unsigned long long не произведет этот битовый порядок. В этом случае может потребоваться переставить биты перед отправкой.
Бит 63 (бит, выбранный маской 0x8000000000000000L) представляет знак числа с плавающей запятой. Биты 62-52 (биты, которые выбираются маской 0x7ff0000000000000L) представляют экспоненту. Биты 51-0 (биты, которые выбираются маской 0x000fffffffffffffL) представляют значение и (иногда называемое мантиссой) числа с плавающей запятой.
Обновление:
Убедитесь, что вы приняли изменение @ Vovanium, чтобы вы работали над правильным набором битов:
double nd = [v doubleValue];
unsigned long long n = *(long long *)&nd;
Попробуйте выполнить тестирование со значением -1,0. 754-битовый шаблон IEEE для -1.0:
0xbff0000000000000
А при сериализации байты будут
00 00 00 00 00 00 f0 bf
Если вместо этого вы получите эти байты:
bf f0 00 00 00 00 00 00
вы столкнулись с проблемой порядка байтов. Если это так, то вы
изменил бы строку в моем примере кода на
i = (int)(n >> ((sizeof(n) - j - 1)*8)) & 0x0ff;
Это просто меняет порядок, в котором декодируется длинный long.