2012-10-21 70 views
0

我有一個指針指向一個字節緩衝區,我將每個偶數索引字節複製到一個int中(因爲數據存儲到緩衝區的協議我知道奇數週期用於讀取)。 現在,當我做到這一點C如何處理符號擴展?

signed int a; 
... 
//inside a loop 
a = buffer[2*i]; //buffer is unsigned 

它給了我一個無符號數。但是,當我這樣做

a = (int8_t)buffer[2*i] 

該號碼以簽署的形式呈現。這迫使我重新思考在c工作中如何進行簽名擴展,特別是在上述情況下。 我的理解是,自從我聲明爲有符號時,編譯器會自動做符號擴展。任何人都可以花一些時間來解釋爲什麼事實並非如此。我剛剛在這個陷阱裏呆了一個小時,不想再次陷入同一陷阱。

+3

好閱讀http://www.cs.umd.edu/class/sum2003/cmsc311/Notes /Data/signExt.html –

+0

我知道C中符號擴展是如何工作的,但是在你有一個無符號數的情況下(但是「符號位」是1),並且你通過強制轉換爲更長的整數來擴展符號,那麼如何處理?對不起,如果這不清楚的問題。 – as3rdaccount

回答

2

buffer是一組無符號八位整數(或作爲一個整數)。這樣的buffer[2*i]值在從0到255(含)的範圍內,並且在該範圍內的所有值都是可表示爲int S,SO分配

a = buffer[2*i]; 

保留值,促進向更廣泛類型int是通過填充零來完成。

如果您分配之前轉換爲int8_t

a = (int8_t)buffer[2*i] 

值在緩衝區大於127轉換以實現定義的方式,通過剛剛重新解釋位模式爲簽署鍵入int8_t,最有可能的8位整數,結果爲負值,從-128到-1。這些值可表示爲int s,因此它們保留在分配中,然後通過符號擴展完成對更寬類型int的值保留升級。

0

int_8只有8位,如果最高位爲1,它將保留一個負值:1xxxxxxx,如果將這樣的值分配給帶符號整數(32或64位),當然會得到負值。 int越長看起來像11111111 11111111 11111111 1xxxxxxx賦值後,只是一個簡單的異或將做的技巧00000000^1001 => 11111001.