当转换为整数时,C++短数组'反转'

kal*_*rus 6 c++ arrays pointers

作为C++的新手,我一直在玩指针.我编写了以下代码来将短数组解释为整数:

#include <iostream>
int main(){
    short array[2] = {10, 9};

    short* pointer = array;
    std::cout << pointer << ": " << *pointer << std::endl;
    // 0xffffcbdc: 10

    pointer++;
    std::cout << pointer << ": " << *pointer << std::endl;
    // 0xffffcbde: 9

    int* pointer2 = (int*) array;
    std::cout << pointer2 << ": " << *pointer2 << std::endl;
    // 0xffffcbdc: 589834
}
Run Code Online (Sandbox Code Playgroud)

为什么整数589'834(0009 000A)而不是655'369(000A 0009)的值?

从打印的指针地址看起来,数组在内存中是有序的,为什么转换为整数更改呢?

das*_*ght 8

此行为未定义:

int* pointer2 = (int*) array;
Run Code Online (Sandbox Code Playgroud)

只有当对齐要求与对齐要求相同或不太严格时T1,T2才允许将指针重新解释为指针(有关详细信息,请参阅参考资料).由于对齐要求比对齐要求更严格,因此指针重新解释无效.T2T1intshort

请注意,重新演绎一个指向int一个指针short将是有效的.

注意:由于行为未定义,您的程序可以执行任何操作,包括打印不正确的值甚至崩溃.但是,您看到的行为最可能的原因是您的系统在较低地址存储较高字节的整数.这是两个常见选项之一:第二个选项是在较高地址存储较高字节.这两个选项称为字节序.有关它的更多信息在这里.