这个片段中发生了啥关于 n 在 pc[i] 中的表示

Posted

技术标签:

【中文标题】这个片段中发生了啥关于 n 在 pc[i] 中的表示【英文标题】:What's going on in this snippet regarding the representation of n in pc[i]这个片段中发生了什么关于 n 在 pc[i] 中的表示 【发布时间】:2018-07-17 18:32:53 【问题描述】:

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

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

谢谢,感谢您的帮助

#include <iostream>
#include <iomanip>

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

int main()


int n0x12345678;
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

【问题讨论】:

“反向”是什么意思?什么对你来说是“前进”的? IE。你期望什么输出?为什么? 请注意,根据 C++ 标准,(uint8_t*)&amp;n 会导致未定义的行为。 是的,确实,“反转”是由于所讨论机器的字节序。你在一个 little-endian 机器上运行它,这就是为什么 n 的最低有效字节在 pc[0] 中找到。 这是一个严格的别名违规。 uint8_t != char @Yunnosch 大端架构的拥护者指出,由此产生的输出将与值本身“相似”:n[0]=0x12, n[1]=0x34, n[2]=0x56, [3]=0x78。我试图在这里发动一场圣战,只是观察他们的论点。 【参考方案1】:

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

小端序:

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

0x78 0x56 0x34 0x12

大端:

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

0x12 0x34 0x56 0x78

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

【讨论】:

以上是关于这个片段中发生了啥关于 n 在 pc[i] 中的表示的主要内容,如果未能解决你的问题,请参考以下文章

hash_table 初始化,发生了啥? [复制]

Javascript - 在这个例子中异步并行的回调发生了啥?

在关于转换对象的地址空间的 c 样式类型转换过程中实际发生了啥?

当执行 import vue from 'vue' 时发生了啥?

python中的lambda函数发生了啥?

我用 C 语言编写了一个程序,它接受两个输入,x 和 n,并将 x 提高到 n 次方。 10^10 不起作用,发生了啥?