以前,我有以下C代碼,通過該C代碼,我希望在演員製作後將變量'sample'的簽名擴展爲'signed short '變量'sample_unsigned'。向左旋轉和向右旋轉以用於標誌擴展(帶符號短)C
unsigned short sample_unsigned;
signed short sample;
sample = ((signed short) sample_unsigned << 4) >> 4;
在二進制表示中,我期望'樣本'有最重要的位重複4次。舉例來說,如果:
sample_unsigned = 0x0800 (corresponding to "100000000000" in binary)
我明白了「樣本」應該結果是:
sample = 0xF800 (corresponding to "1111100000000000" in binary)
然而,「樣本」永遠結束是一樣的「sample_unsigned」,我不得不分割轉讓聲明如下,哪些工作。爲什麼這個?
sample = ((signed short) sample_unsigned << 4);
sample >>= 4;
我知道右移的符號擴展會產生未定義的行爲。我正在研究64位Ubuntu 12.04,在檢查了我的gcc文檔後,我決定嘗試一下。我需要做這種操作的原因是因爲我從一個提供10位有符號值的硬件平臺捕獲數據,後來我需要將其另存爲ASCII。正如你所建議的,我猜想使用'uint16_t'和'int16_t'應該是一個更穩定的解決方案。 –
@CarlosCastro:我已經預料到了這種應用。我自己在嵌入式系統上使用它。只是不要依賴那個!上面的簡單條件將不會在具有條件移動指令的平臺上採用更多時鐘(IIRC,x64確實提供了這樣的功能,ARM明確做到這一點)。請注意,這是 - 像你問題中的代碼 - 是12位有符號整數,而不是10位;所以你必須調整口罩!如果只是爲了轉換,可能會有更簡單的技術。如果你可以節省內存空間,你甚至可以生成一個簡單的查找表。 – Olaf
@CarlosCastro:我稍微更新了答案。如果答案有幫助,請隨時註冊。如果您需要最佳性能,只需對變體進行基準測試(但要小心**您實際測試的基準) – Olaf