Как преобразовать 64-битное целое число в массив символов и обратно?

У меня возникли проблемы с преобразованием int64_t в массив char и обратно. Я не знаю, что не так с приведенным ниже кодом, для меня это имеет полный логический смысл. Код работает для a, как показано, но не для второго числа b, которое явно попадает в диапазон int64_t.

#include <stdio.h>
#include <stdint.h>

void int64ToChar(char mesg[], int64_t num) {
  for(int i = 0; i < 8; i++) mesg[i] = num >> (8-1-i)*8;
}

int64_t charTo64bitNum(char a[]) {
  int64_t n = 0;
  n = ((a[0] << 56) & 0xFF00000000000000U)
    | ((a[1] << 48) & 0x00FF000000000000U)
    | ((a[2] << 40) & 0x0000FF0000000000U)
    | ((a[3] << 32) & 0x000000FF00000000U)
    | ((a[4] << 24) & 0x00000000FF000000U)
    | ((a[5] << 16) & 0x0000000000FF0000U)
    | ((a[6] <<  8) & 0x000000000000FF00U)
    | ( a[7]        & 0x00000000000000FFU);
  return n;
}

int main(int argc, char *argv[]) {
  int64_t a = 123456789;
  char *aStr = new char[8];
  int64ToChar(aStr, a);
  int64_t aNum = charTo64bitNum(aStr);
  printf("aNum = %lld\n",aNum);

  int64_t b = 51544720029426255;
  char *bStr = new char[8];
  int64ToChar(bStr, b);
  int64_t bNum = charTo64bitNum(bStr);
  printf("bNum = %lld\n",bNum);
  return 0;
}

вывод:

aNum = 123456789
bNum = 71777215744221775

Код также дает два предупреждения, от которых я не знаю, как избавиться.

warning: integer constant is too large for ‘unsigned long’ type
warning: left shift count >= width of type
11
задан user1161604 14 March 2012 в 03:58
поделиться