c++ - 这段代码中关于 n 在 pc[i] 中的表示是怎么回事

标签 c++ pointers casting memory-layout

我不知道发生了什么。而不是 uint8_t,我猜想我们需要转换为 1 字节类型的指针,如 char 或 bool 来实现此行为。我猜相反的性质是由于字节顺序?

编辑:我发现我的思维错误,当然 uint8_t 的大小是 8 位 = 1 字节,就像 bool 和 char(至少在我的机器上是这样)。我错误地想到了 sizeof(pc),它是一个指针,因此在我的 64 位机器上是 8byte。现在,对于字节顺序,一切都变得有意义了。

谢谢,谢谢你的帮助

#include <iostream>
#include <iomanip>

using std::cout;
using std::endl;
using std::hex;

int main()
{

int n{0x12345678};
cout << "01|    n=0x" << hex << n << endl;

uint8_t* pc{(uint8_t*)&n};
cout << "02|    n[0]=0x" << hex << +pc[0] 
    << ", n[1]=0x" << +pc[1]    // small trick: + to var to use as number
    << ", n[2]=0x" << +pc[2]
    << ", n[3]=0x" << +pc[3] << endl;

pc[1]=0xab;
pc[2]=0xcd;
cout << "03|    n[0]=0x" << hex << +pc[0] 
    << ", n[1]=0x" << +pc[1]
    << ", n[2]=0x" << +pc[2]
    << ", n[3]=0x" << +pc[3] << endl;
return 0;

}

输出:

01|    n=0x12345678
02|    n[0]=0x78, n[1]=0x56, n[2]=0x34, n[3]=0x12
03|    n[0]=0x78, n[1]=0xab, n[2]=0xcd, n[3]=0x12

最佳答案

问题的根源在于字节序:多字节数字中的字节顺序。

小字节序:

最低有效字节在前。
给定 0x12345678,该值将存储在 Little Endian 中:

0x78 0x56 0x34 0x12

大字节序:

最高有效字节在前。 给定 0x12345678,该值将存储在 Big Endian 中:

0x12 0x34 0x56 0x78

字节顺序是处理器级别的定义。不同的处理器以不同的方法存储多字节数字。

关于c++ - 这段代码中关于 n 在 pc[i] 中的表示是怎么回事,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51388189/

相关文章:

c++ - 为什么 mac os sdl2 程序窗口没有响应?

c++ - C++ 中的 CPU 定时器

c - 如何获取基指针、栈指针和保存基指针的值

types - obj[] 和 string[] 作为参数

swift - Swift 中的类型检查是如何工作的

c++ - gcc4mbed 编译器问题 (c++)

c++:遍历 std::hash_map 的顺序

c - 变量 'var' 周围的堆栈已损坏

c - 将 double as (void *) 传递给函数

java - Java 中的异或字节