我正在读取字符流,我需要它们直接作为uint64_t值。我使用以下方法。但是似乎数组是按向后顺序存储的。但是,当我输出它们的地址时,存储位置是正确的。抱歉,这是一个愚蠢的问题。我正在努力弄清我的基本记忆知识。
#include <iostream>
int main() {
unsigned char ar[8] = {1, 0, 0, 0, 0, 0, 0, 0};
uint64_t num = *((uint64_t*)ar);
std::cout << num << std::endl;
for(size_t i = 0; i < 8; i++) {
std::printf("%lu %x\n", i, &ar[i]);
}
}
以下是输出
1
0 ffffcc08
1 ffffcc09
2 ffffcc0a
3 ffffcc0b
4 ffffcc0c
5 ffffcc0d
6 ffffcc0e
7 ffffcc0f
我希望num
的结果为2 ^ 56。
答案 0 :(得分:1)
问题是字节序,您的系统是小字节序,并且您像在大字节序系统中一样读uint64_t
。
在c ++ 20中有一种不分支的编译时解决方案:
您可以在编译时使用std::endian
查找endian
,并使用if constexpr
来确定函数的工作方式。
#include<iostream>
#include <type_traits>
template <typename T>
void print()
{
constexpr bool is_little_endian = (std::endian::native == std::endian::little);
if constexpr (is_little_endian) {
unsigned char ar[8] = {0, 0, 0, 0, 0, 0, 0, 1};
T num = *((T*)ar);
std::cout << num << std::endl;
} else {
unsigned char ar[8] = {1, 0, 0, 0, 0, 0, 0, 0};
T num = *((T*)ar);
std::cout << num << std::endl;
}
}
int main()
{
print<uint64_t>();
}
输出
72057594037927936