C++ 内存中的阵列存储

C++ 内存中的阵列存储,c++,memory,C++,Memory,我正在读取一个字符流,我需要它们直接作为uint64\t值。我采用了以下方法。但数组似乎是按向后顺序存储的。但是,当我输出它们的地址时,内存位置是有序的。对不起,如果这是一个太愚蠢的问题。我正在努力找出我的基本记忆知识 #包括 int main(){ 无符号字符ar[8]={1,0,0,0,0,0,0}; uint64_t num=*((uint64_t*)ar); std::cout问题在于endian,您的系统是小endian,您读取uint64\u t就像在大endian系统中一样。 在c

我正在读取一个字符流,我需要它们直接作为uint64\t值。我采用了以下方法。但数组似乎是按向后顺序存储的。但是,当我输出它们的地址时,内存位置是有序的。对不起,如果这是一个太愚蠢的问题。我正在努力找出我的基本记忆知识

#包括
int main(){
无符号字符ar[8]={1,0,0,0,0,0,0};
uint64_t num=*((uint64_t*)ar);

std::cout问题在于endian,您的系统是小endian,您读取
uint64\u t
就像在大endian系统中一样。 在c++20中有一种编译时解决方案没有分支:

您可以使用在编译时查找
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>();
}
#包括
#包括
模板
作废打印()
{
constexpr bool是_little_endian=(std::endian::native==std::endian::little);
if constexpr(是小的){
无符号字符ar[8]={0,0,0,0,0,0,0,1};
T num=*((T*)ar);

Std::CUTE被称为“种子”。你应该改变字节的顺序。注意不同的计算机可能有不同的字节数,你不需要反转字节。C++中没有任何东西可以说字节必须是一个或多个。我想你明白了我的意图。什么是最好的可移植方法?我知道的一种可移植的方法。你可以为一个整数编写一个测试,看看是哪种方法,然后将其用于所有后续转换。有没有无分支的方法,stackoverflowers的同事们?我需要在性能关键的代码段中使用此方法。现在,我会使用你的方法。无论如何,谢谢。你知道你的目标是哪一个吗编译的目的是什么?条件编译将是最有效和半可移植的方法。非常感谢。我将使用此解决方案。
#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>();
}