如何将unsigned char数组转换为unsigned long long?

j. *_*doe 5 c c++ type-conversion

假设我有8个unsigned char,我想将其转换成long long long。

例如,如果所有char都等于0xFF,则无符号long long等于0xFFFFFFFFFFFFFFFFFF。

用C或C ++最有效的方法是什么?

Kei*_*son 5

例如:

unsigned char buffer[8] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
unsigned long long target;
memcpy(&target, buffer, sizeof target);
Run Code Online (Sandbox Code Playgroud)

请注意,如果不是所有元素都buffer具有相同的值,则结果将取决于字节顺序(小尾数与大尾数)。

这也假定unsigned long long正好是8个字节。通常这是正确的,但不能保证。(也不能保证一个字节正好是8位;它可以更多。unsigned char按定义,An 是1个字节。)

  • @Jason:不,它将始终提供64位或`64 / CHAR_BIT`字节。但是,如果您假设`CHAR_BIT == 8`,那么是的,`uint64_t`始终为8个字节(如果存在!)。 (3认同)

yng*_*ccc 5

您可以直接分配位,而不是 memcpy

  unsigned char buffer[8] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
  unsigned long long l = 0;
  for (int i = 0; i < 8; ++i) {
    l = l | ((unsigned long long)buffer[i] << (8 * i));
  }
Run Code Online (Sandbox Code Playgroud)

我相信这不受字节顺序的影响。