1

我必须为学校做一个小作业。我正在用 C 写这个。问题是:

给定

uint16_t A[] = { 0xabce, 0x43fe, 0xcf54, 0xffff };
uint8_t *p = (uint8_t *)&A[0];

的价值是p[3]多少?

我做了一些研究,发现这些数字将使用 little-endian 重新输入我的计算机。所以

p[] = {171, 67, 207, 255}

但是,当我打印时,p[]我得到

p[0] = 206
p[1] = 171
p[2] = 254
p[3] = 67

我对此感到非常困惑,谁能告诉我为什么会这样?

4

1 回答 1

3

所以,要明确一点 - 在一个小端机器中,这个声明:

uint16_t A[] = { 0xabce, 0x43fe, 0xcf54, 0xffff };

将这些字节按顺序排列在您的记忆中:

ce | ab | fe | 43 | 54 | cf | ff | ff |

(十进制):

206|171 |254 | 67 | 84 | 207| 255| 255|

因此,当您告诉编译器从内存中的相同位置开始时,您可以读取一个字节长的数字,“p”向量中可检索的是上面的 8 个数字。

uint8_t *p = (uint8_t *)&A[0];

(也可以简单写成uint8_t *p = (uint8_t *)A;

请记住,在 C 语言中,开发人员的任务是了解向量的长度。在此示例中,可能会有一个约定,例如数字“0xffff”将结束 16 位序列。无论哪种方式,您都有两倍数量的元素可以读取为 8 位。

于 2016-02-25T23:17:04.413 回答