簡體   English   中英

C如何處理符號擴展?

[英]How does C handle sign extension?

我有一個指向字節緩沖區的指針,我將從中將每個偶數索引字節都復制到一個int(因為該協議將數據存儲在緩沖區中,我知道奇數周期可供讀取)。 現在當我這樣做

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

它給了我一個未簽名的號碼。 但是當我這樣做時

a = (int8_t)buffer[2*i]

數字以簽名形式顯示。 這迫使我重新考慮c中的符號擴展如何工作,尤其是在上述情況下。 我的理解是,由於我聲明為簽名,因此編譯器將自動進行符號擴展。 任何人都可以花一些時間來解釋為什么不是這種情況。 我在這個陷阱中呆了一個小時,不想以后再陷入同一陷阱。

buffer是一個無符號八位整數數組(或充當一個整數)。 因此, buffer[2*i]值在0到255(包括)范圍內,並且該范圍內的所有值都可以表示為int s,因此分配

a = buffer[2*i];

保留值,通過用零填充來提升為更大的類型int

如果您在分配前int8_tint8_t

a = (int8_t)buffer[2*i]

大於127的緩沖區中的值將以實現定義的方式轉換為int8_t類型,很可能是通過將位模式重新解釋為帶符號的8位整數,這導致從-128到-1的負值。 這些值可以表示為int ,因此將它們保留在賦值中,然后通過符號擴展將值保留提升為更廣泛的類型int

一個int_8僅具有8位,如果最高位為1,則它具有負值:1xxxxxxx,如果將這樣的值分配給有符號的int(32位或64位),則當然會得到一個負值。 賦值后,較長的int看起來像11111111 11111111 11111111 1xxxxxxx ,只是一個簡單的xor就可以完成技巧00000000 ^ 1001 => 11111001。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM