这很简单,问题在于您正在移位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 = 123456789bNum = 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;}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)