2017-01-22 25 views
1

我被困在上面的問題。 有一個數組中int8_t:Ansi C int16_t引用int8_t數組

int8_t i8array[3]; 
i8array[0] = 10; 
i8array[1] = 15; 
i8array[2] = 100; 

而且我想不只是轉換也引用int16_t到i8array [1]。 所以我希望有一個新的變量i16var,這與15 < < 8 + 100 = 3940

值的int16_t如果我改變i16var到3941,應該從100改變i8array的第2項爲101。

是否ANSI C有這種條件?我嘗試了很多東西,甚至在這裏,我只是找到了在這些類型之間轉換的答案。

+0

爲了避免誤解,i8array可能#2後,其他項目這是不是i16var有趣。 – Daniel

+0

你說你已經嘗試了很多東西。你有什麼嘗試?將此添加到您的問題。 –

+4

你正在尋找的是不可靠的。除此之外,還有一些機器,其中'&i8array [1]'不會被正確對齊以作爲int16_t'指針處理。你在內存中假設一個大端的佈局;這可能不是你的CPU的工作方式。另外,你需要兩個變量來引用相同的位置;你只能用'union'或指針來做到這一點。您可以嘗試使用'int16_t * i16p =(int16_t *)&i8array [1];'然後使用'int16_t i16 = * i16p;'讀取並使用'* i16p = 3941;'來寫入,但這可能會或可能不會崩潰,可能會或可能不會產生你想要的結果。 –

回答

1

對齊和尾數是關鍵問題。下面應該處理對齊問題,也許是endian問題。祝你好運。不建議編碼方法。

int main(void) { 
    union { 
    struct { 
     int8_t dummy; 
     int8_t i8array[3]; 
    } view1; 
    struct { 
     int16_t dummy; 
     int16_t i16var; 
    } view2; 
    } u; 

    u.view1.i8array[0] = 10; 
    u.view1.i8array[1] = 15; 
    u.view1.i8array[2] = 100; 
    printf("%d\n", htons(u.view2.i16var)); 
    u.view2.i16var = htons(3941); 
    printf("%d\n", u.view1.i8array[2]); 
    return 0; 
} 

輸出

3940 
101