преобразование массива байтов для удвоения - c

Используя document.title то, как Вы выполнили бы его в JavaScript, но как это, как предполагается, помогает с SEO? Боты обычно не выполняют код JavaScript, поскольку они пересекают через страницы.

8
задан Sinan Ünür 20 August 2009 в 04:35
поделиться

7 ответов

Изменить: это не будет работать (см. комментарий) без чего-то вроде __ int128 .

a = input[i] << 8*i;

Выражение input [i ] повышается до int ( 6.3.1.1 ), который на вашем компьютере является 32-битным.

4
ответ дан 5 December 2019 в 12:11
поделиться

Почему бы просто не преобразовать массив в двойной указатель?

unsigned char input[16];

double* pd = (double*)input;

for (int i=0; i<sizeof(input)/sizeof(double); ++i)
    cout << pd[i];

если вам нужно исправить порядок байтов, перед преобразованием в массив типа double переверните массив символов с помощью STL reverse ().

2
ответ дан 5 December 2019 в 12:11
поделиться

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

байт , целочисленный тип и double , тип с плавающей запятой (т. е. не целочисленный тип) не являются побитовыми совместимыми (то есть вы не можете просто сдвинуть биты до значений группы байтов в тип с плавающей запятой и ожидайте эквивалентного результата.)

1) Предполагая, что байтовый массив представляет собой буфер памяти, ссылающийся на целочисленное значение, вы сможете преобразовать свой байтовый массив в 128 -битовое целое число с помощью битового сдвига, а затем преобразовать полученное целое число в double . Не забывайте, что проблемы с порядком байтов могут возникнуть в зависимости от архитектуры процессора.

2) Предполагая, что байтовый массив представляет собой буфер памяти, который содержит 128-битное длинное двойное значение, и предполагая, что нет проблем с порядком байтов, вы должны иметь возможность записать значение из байтового массива в длинное двойное значение

union doubleOrByte {
    BYTE buffer[16];
    long double val;
} dOrb;
dOrb.val = 3.14159267;
long double newval = 0.0;

memcpy((void*)&newval, (void*)dOrb.buffer, sizeof(dOrb.buffer));
2
ответ дан 5 December 2019 в 12:11
поделиться
1
ответ дан 5 December 2019 в 12:11
поделиться

Вы пытаетесь преобразовать строковое представление числа в действительное число? В этом случае вам лучше всего подойдет C-стандарт atof.

1
ответ дан 5 December 2019 в 12:11
поделиться

Основываясь на приоритете операторов, правая часть

a = input[i] << 8*i;

оценивается перед преобразованием в двойное, поэтому вы сдвигаете input [i] на 8 * i битов, в которых хранится его результат - 32-битная временная переменная и, следовательно, происходит переполнение. Вы можете попробовать следующее:

a = (long long unsigned int)input[i] << 8*i;

Изменить: Не уверен, какой размер дубля в вашей системе, но в моем случае это 8 байтов, если это так для вас, а также вторая половина вашего ввода массив никогда не будет виден, поскольку сдвиг переполнит даже тип double.

0
ответ дан 5 December 2019 в 12:11
поделиться

Проблема в том, что на самом деле 32-битные переменные не могут быть сдвинуты более чем в 4 * 8 раз, т.е. ваш код работает только для 4 символов.

Что вы могли бы сделать, так это найти первый значимый символ и используйте закон Хорнера: a n x n + a n-1 n-1 + ... = ((.. . (a n x + a n-1 ) .x + a n-2 ). x + ...) + a 0 следующим образом:

char coefficients[16] = { 0, 0, ..., 14, 15 };
int exponent=15;
double result = 0.;

for(int exponent = 15; exp >= 0; --exp ) {
   result *= 256.; // instead of <<8.
   result += coefficients[ exponent ];
}
4
ответ дан 5 December 2019 в 12:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: