内存中的阵列存储

Array storage in memory

本文关键字:存储 阵列 内存      更新时间:2023-10-16

我正在读取一串字符,我需要将它们直接作为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 %xn", i, &ar[i]);
    }
}

以下是输出

1
0 ffffcc08
1 ffffcc09
2 ffffcc0a
3 ffffcc0b
4 ffffcc0c
5 ffffcc0d
6 ffffcc0e
7 ffffcc0f

我预计num的结果是 2^56。

问题是字节序,你的系统是小端序,你像在一个大端系统中一样阅读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