2015-08-24 132 views
1

可以說我有一個整數(32位),它存儲一個n位無符號數(帶有n < 32)。 如何使用二進制補碼將其有效轉換爲符號解釋?將n位整數從無符號轉換爲有符號

一個簡短的例子來闡明我的意思:

int numUnsigned = 15; // Store a 4-bit value 0b1111 
int numSigned = ???; // Convert to 4-bit signed value using two's complement 
// Now numSigned should be -1, since 0b111 == -1 

我一直在與位全部搞亂上午,但似乎無法得到它的權利。

+0

如何只延長MSB(4日),直到位32?這應該給你第4位數字的有符號表示。 –

+0

你從哪裏得到'n'有點不清楚。 –

+0

@Caleb我知道這不是2的補充。我只是誤解了這個問題。 –

回答

3

如果我正確理解您的問題,您只需要一個符號擴展名,而不是2的補充(至少根據您在第二行代碼中的註釋)。

如果我是正確的,你可以做以下(假設你有N個數字,0 <ñ< 32):

unsigned msb_mask = 1 << (N-1); // setup a mask for most significant bit 
numSigned = numUnsigned; 
if ((numSigned & msb_mask) != 0) // check if the MSB is '1' 
{ 
    numSigned |= ~(msb_mask-1); // extend the MSB 
} 

也許我誤解你的問題......如果是這樣,然後不理我回答。

編輯

通過@harold建議:

numSigned = (numUnsigned^msb_mask)-msb_mask ; 
+0

工程就像一個魅力。 – Boris

+0

你可以做到這一點更簡單,但我不能回答 – harold

+0

@Boris'(x^8) - 8'這就是你需要的所有 – harold

相關問題