2013-05-21 28 views
2

我試圖檢查並查看是否在unsigned int中設置了一位。我不知道我該如何做到這一點,但我認爲它會是這樣的。我試圖在C++的CDQ指令(但功能)C/C++檢查位31是否設置爲無符號int

這裏是我有什麼

unsigned int cdq(unsigned int eax) 
{ 
    unsigned int edx = 0; 

    if((eax >> 31) & 1) { edx = 0xFFFFFFFF; } 
    return edx 
} 

當我使用功能具有以下值:

CDQ(0×12345678)因此應該返回0(無符號整數)-1 cdq(0x01)位31沒有設置(0)米不知道爲什麼

+2

0x12345678中的位31如何設置?最高位設爲第28位。 – syam

+0

@juanchopanza「您需要'eax >> 30'」 - 錯誤。 –

+1

如果「last」位爲0,那麼'eax&0x7FFFFFFF'爲0,否則爲!= 0。假設unsigned int至少有32位。然後注意在0x12345678位31沒有設置。 – ShinTakezou

回答

6

CDQ(0×12345678)第31位被設置(1)

不,這不是......最高位集是位28:

1 2 3 4 5 6 7 8 
0001 0010 0011 0100 0101 0110 0111 1000 
^^
| | 
31 28 

你的代碼應該工作,但我將使用

if(eax & (1U << 31)) edx = 0xFFFFFFFF; 

,因爲這是一個有點更直接,它變爲一個常數而不是一個變量,這樣做更少的工作在運行時(儘管一個優化的編譯器應該產生兩者的代碼相同)。

其實我會寫類似

int cdq(int eax) 
{ 
    return eax < 0? -1 : 0; 
} 

順便問一下,你的代碼實際上並不執行幹熄焦因爲你的EAX和EDX變量而不是硬件EAX和EDX寄存器。並且將ASM指令複製爲C函數並不是一個好主意...... C有自己的特性來完成這些事情,例如,

int32_t foo = -0x12345678; 
int64_t bar = (int64_t)foo; 
+1

好點@caf,但也許你可以留下評論,因爲我仍然在完善這個答案......編輯它有點侵略性。 –

相關問題