2

我有一个 char 数组,有 8 个位置(char data[8];),这个数组上有一个 unsigned long long int 值(8 个字节大小)... data[0] 有 long long 的第一个字节int, data[1] 有第二个,依此类推。我的问题是如何将该值再次放在 unsigned long long 变量上?

我试过换班,但值不等于原始值,我怎么能在不改变原始数组的情况下做到这一点......

字节的顺序是 little endian 变量的正常顺序(从高位到低位)

这是一个打印与预期不同的值的代码。

char vec[8]={0,0,0,0,0,0,0,1};

unsigned long long value = *((unsigned long long*) vec);

std::cout<<value;

return 0;

结果应该是 1,而是 72057594037927936。感谢您的耐心等待。

4

4 回答 4

4

data假设数组的字节顺序与结果long long值相同

unsigned long long ll;
assert(sizeof ll == sizeof data);
memcpy(&ll, data, sizeof ll);

避免基于演员表的解决方案。它们违反了严格的别名语义,因此不能保证有效。

于 2012-07-26T03:47:46.213 回答
1

你可以做:

unsigned long long value = *((unsigned long long*) data);

但这假设:

  1. data正确对齐以作为long long. 例如,如果long long需要 8 字节对齐但data仅 4 字节对齐,它可以做坏事。
  2. 的字节data存储顺序与当前机器的字节顺序相同long long。请参阅字节顺序
于 2012-07-26T03:45:32.410 回答
1

取决于硬件表示,直接转换可能不起作用,这在大多数情况下应该起作用:

long long to_llong(unsigned char *data) {
    long long v = 0;
    for (int i = 0; i < 8; i++) {
      v = (v << 8) | data[i];
    }
    return v;
}
于 2012-07-26T03:50:28.483 回答
0

你说的第一个字节是什么意思?它是最低有效字节还是最高有效字节?

该问题的答案决定了数值是小端还是大端。维基百科链接

如果 value 的 endian 样式与您的系统相同,您可以直接将第一个字节的地址转换为“unsigned long long *”,如果不一样则必须转换其 endian 样式。

于 2012-07-26T04:07:40.333 回答