uint8_t foo[] = {7, 7};
int i = foo[0] + 256 * foo[1];
В js я могу получить это так
…Int8Array…
Скажи,
- а что будет, если элемент массива foo будет иметь отрицательное значение?
- а что будет, если твой код запустить на архитектуре с порядком байт big-endian?
Спасибо. А как называется эта конвертация? Понятно что мы берем два байта и получаем 16-ти битное число. Я просто час где-то гуглил и ничего подобного не нагуглил. И как будет выглядеть эта формула, если допустим массив будет из 4-х цифр?
Как то так?: foo[0] + 256 * (foo[1]) + foo[2] + 256 * (foo[3])
конкретно эта запись -- вычисление значения полинома по схеме Горнера. А вообще тут записано вычисление значения числа по его "цифрам" и весам каждой "цифры". Каждый байт -- это цифра в 256-ричной системе исчисления.
Я бы сделал не через умножение и сложение, а через битовый сдвиг влево на 8 и битовое ИЛИ, это больше отражает суть действия для читающего код.
Для положительных чисел в foo оба вариант дадут один и тот же результат.
Называется это, видимо, десериализацией 2ух (4ёх) байтового целого. Обратная операция - сериализация - конвертирует целое в массив байт. Подобные операции применяются, при передаче данных по сети или записи в файл, в случаях когда надо обеспечить независимость данных от аппаратной платформы.
Matvey_Mt, знак у чисел в массиве foo не имеет смысла. Но если ты хочешь трактовать результат как знаковое число, можно выполнить расширение знакового бита. Для исходного примера и 16-битного результата:
uint8_t foo[] = {7, 7};
int i = ((foo[0] + 256 * foo[1]) ^ 0x8000) - 0x8000;
jcmvbkbc, У меня именно int8_t, а там же знак числа имеет смысл.
В любом случает спасибо, на stack overflow подсказали вот такой коротки вариант: *(int*)foo.data()
Matvey_Mt, можно начать с того, что ты хотел извлечь 16-битное значение, а *(int*)foo.data() извлекает примерно 32 бита. Ну и там дальше ещё пара пунктов по мелочи, типа отсутствия гарантии выравнивания, зависимости от порядка байт используемой платформы, опять же беззнаковость извлечённого числа.
В целом этот короткий вариант -- г*код.