从 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 位。
我必须为学校做一个小作业。我正在用 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 位。