2016-02-25 32 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位。