c - 如何将 64 位整数转换为 char 数组并返回?

标签 c linux

我在将 int64_t 转换为 char 数组并返回时遇到问题。我不知道下面的代码有什么问题,这对我来说是完全合乎逻辑的。如图所示,该代码适用于 a,但不适用于显然属于 int64_t 范围的第二个数字 b

#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

最佳答案

这很简单,问题是您正在移动 char 数组中的位,但 a[i] 的大小是 4 个字节(向上转换为 int),所以你的类次超出了范围。尝试在您的代码中替换它:

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

通过这种方式,您可以在转换之前将 char 转换为 64 位数字,并且不会超出范围。您将获得正确的结果:

entity:Dev jack$ ./a.out 
aNum = 123456789
bNum = 51544720029426255

只是一个旁注,我认为这也可以正常工作,假设您不需要查看 char 数组内部:

#include <string.h>

void int64ToChar(char a[], int64_t n) {
  memcpy(a, &n, 8);
}

int64_t charTo64bitNum(char a[]) {
  int64_t n = 0;
  memcpy(&n, a, 8);
  return n;
}

关于c - 如何将 64 位整数转换为 char 数组并返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9695720/

相关文章:

c - 如何解决这个语义错误?

c - 将 "implicit declaration of function foo"视为错误

java - UnsatisfiedLinkError: 无法从加载程序加载 X

c - Windows系统编程

android -/proc/slabinfo 提供什么信息?

linux - 如何访问i2c设备驱动节点

c - '错误: expected expression before '{' token' - matrix as member of struct

c++ - arduino 和 Visual Studio C++,2 路串行通信

c - 信号处理不适用于 -ansi 或 POSIX define

linux - 有人可以解释下面的代码和下面的查询吗