从 uint_16t 转换后 uint8_t 的值

Value of uint8_t after being converted from uint_16t

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

给出

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

p[3] 的值是多少?

我做了一些研究,发现这些数字将使用小尾数法放回我的计算机中。所以

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

然而,当我打印 p[] 我得到

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

我对此很困惑,谁能告诉我为什么会这样?

所以,需要明确的是 - 在小端机器中,这个声明:

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 位。