阵列存储在内存中

时间:2019-07-27 10:58:49

标签: c++ memory

我正在读取字符流,我需要它们直接作为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。

1 个答案:

答案 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

Live

相关问题