2016-12-06 28 views
1

由於標題假設我試圖將十六進制數字(如0x320000dd)轉換爲十進制數字。 我的代碼僅適用於正數,但在表示負數的十六進制數字時會失敗。這裏是我的代碼片段:在十進制數字中正確轉換十六進制數字(也是負數)

  cin>>hex>> x; 
     unsigned int number = x; 
     int r = number & 0xffffff; 

我的輸入是十六進制的alreay,並且計算機自動將它轉換爲整數。我想要做的是獲得十六進制數的操作數,所以最後24位。 你能幫我讓我的代碼工作負值:0x32fffdc9或0x32ffffff?非常感謝!

編輯:

,我想我的輸出是: 0x32fffdc9 - > -567 或 0x32ffffff - > -1

所以只是普通的十進制值,而是它給了我16776649和16777215爲上面的例子。

+1

@kiner_shah十六進制最可能是std :: hex。 – Borgleader

+0

@Borgleader,明白了! :-) –

+0

哦,我很抱歉,我錯過了告訴你,我包括'使用名稱空間標準;'在我的代碼中。所以std :: hex不會改變任何東西,對吧? :) – Jennan

回答

1

負整數通常存儲在2's complement這意味着如果未設置最高有效位(MSB),則該數不爲負數。這意味着,就像您需要取消設置您的號碼的8個MSB以將32位數字設置爲24位正數一樣,所以您需要設置您的號碼的8個MSB來鉗位負數:

const int32_t r = 0x800000 & number ? 0xFF000000 | number : number & 0xFFFFFF; 

vector<bool>bitset可能是值得你考慮,因爲他們將澄清十六進制數位的範圍內進行設置。

+0

謝謝你的回答,我不完全理解它,因爲英文不是我的母語,而且我使用的是舊版C++編程,它不允許我使用int32_t,但是你所說的是獲取MSB在0x32ffffff的情況下會是第2個後面的第一個f,對吧?如果它是8或更高,則表示負數。我理解正確嗎? 另外,在我知道它是否爲否定之後,我不能只在價值的前面加一個' - ',對吧?我需要計算差異是否正確? – Jennan

+0

@Jennan 1)如果你的編譯器不能處理'int32_t',你應該在使用標準容器時放置更多的值2)是的,我說24位整數的MSB將定義它是否爲負3)否,你不能簡單地否定24位整數來得到它的負表示,'-'執行2的補碼操作,並且你不希望你的24位整數被修改,所以你需要這樣做面具。 –

+0

非常感謝! – Jennan

相關問題