这个片段中发生了啥关于 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*)&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] 中的表示的主要内容,如果未能解决你的问题,请参考以下文章
Javascript - 在这个例子中异步并行的回调发生了啥?
在关于转换对象的地址空间的 c 样式类型转换过程中实际发生了啥?
当执行 import vue from 'vue' 时发生了啥?
我用 C 语言编写了一个程序,它接受两个输入,x 和 n,并将 x 提高到 n 次方。 10^10 不起作用,发生了啥?