2011-08-06 65 views
2

給出如下的程序如何識別有符號整數是否將轉到-ve或+值。c中的無符號整數

int main() 
{ 
    int a=0xDEADBEEF; 
    printf("%d",a); 
    return 0; 
} 

此輸出在-ve.But有沒有任何簡單的方法來快速識別它,而無需在Visual Studio中執行。

+0

你的意思是你想識別打印的整數是正數還是負數? –

+0

是的,在gcc中運行它:D –

回答

6

隨着一些位魔術:

int negative = (input >> ((sizeof(int) * 8) - 1)) & 0x01; 

來解釋它:

在C,負數爲補碼,其中最高位代表符號。我們首先使用sizeof(int) * 8來確定int在當前平臺上有多少位。要通過右移獲得最高位,我們需要移動size - 1。由於C中的右移是算術的(意思是如果最高位是1,我們從左邊開始填充整數1),我們需要使用邏輯和0x01(或簡單地1) )。

結果是int與值1如果輸入爲負,或者如果0它是正的。

如果你想在紙上做,取高字節(在你的情況下,DE),寫出上半部分(D),並檢查其高位是零還是一位。

+0

+1,這是一款優雅便攜的解決方案。 –

+0

...仍然需要編譯和運行。 –

+0

您也可以在紙上做,因爲您不必寫出整個數字,這比您的解決方案更容易。 – Femaref

0

您必須知道int的寬度(值的位數)才能決定。

您還必須在格式字符串末尾輸入\n以確保有輸出。

3

查看該值是否小於0x80,0x8000,0x80000000或0x8000000000000000,具體取決於類型的位深度。如果它小於那麼它是正數,否則是負數。

1

如果第一位(符號位)爲1,則該值爲負值。否則,這是積極的。

順便說一句,與正數的數量相比,還有一個負數。

0

0xDEADBEEF大於系統上的INT_MAX0x7FFFFFFF),因此轉換爲int是實現定義的。常見的二進制補碼實現將其定義爲將模2*INT_MAX+2簡化爲範圍[INT_MIN,INT_MAX]