2016-02-25 95 views
1

我必须为学校做一个小型作业。我在C.写这个的问题是:从uint_16t转换后uint8_t的值

鉴于

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 

我感到很困惑这个,谁能告诉我为什么发生这种情况?

+1

你知道'p [0]'和'p [1]'都会指向A [0]的单独字节吗? –

+0

投射指针不会转换。 p [0]是A [0]的第一个字节,p [1]是A [0]的第二个字节,p [2]是A [1]的第一个字节]'等 –

+0

'uint8_t'不是字符类型,因此这是未定义的行为。 – EOF

回答

3

所以,仅仅指刚要清楚 - 在一个小尾数machinne,此声明:

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