Следующий код является более эффективным:
unsigned char[word_size] = ...;
int64_t num = 0;
for (int i = 0 ; i < sizeof(a) ; i++)
num = (num << 8) | a[i];
Это предполагает большой Endian (наивысший порядок байт первый) порядок байтов в массиве. Для небольшой Endian (как вы, кажется, использовать) только обрабатывать его сверху вниз:
for (int i = sizeof(a) ; --i >= 0 ;)
Примечание: char
подписан ли или без знака зависит от конкретной реализации, так пригвоздить его вниз, чтобы быть без знака, в противном случае логическое или не будет работать. Лучше использовать uint8_t
; который определяется как 8 бит, а char
- не.
Примечание: для констант следует использовать все-верхний регистр: WORD_SIZE
вместо word_size
. Это общепринятый стандарт (вполне единственный случай для идентификаторов в C).
'<<' отлично работает с 'long'. В этом случае 'num' всегда равно 0, и поэтому вы очищаете' a' ко всем 0s. – rici
'long' не обязательно 64 бит. Если вы хотите убедиться, используйте 'int64_t' из' stdint.h'. Это предложенный путь. Кроме того, убедитесь, что массив имеет правильный порядок байтов. – Olaf