我必须为学校做一个小任务。我在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
我很困惑,有人可以告诉我为什么会这样吗?
答案 0 :(得分: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位。