給出如下的程序如何識別有符號整數是否將轉到-ve或+值。c中的無符號整數
int main()
{
int a=0xDEADBEEF;
printf("%d",a);
return 0;
}
此輸出在-ve.But有沒有任何簡單的方法來快速識別它,而無需在Visual Studio中執行。
給出如下的程序如何識別有符號整數是否將轉到-ve或+值。c中的無符號整數
int main()
{
int a=0xDEADBEEF;
printf("%d",a);
return 0;
}
此輸出在-ve.But有沒有任何簡單的方法來快速識別它,而無需在Visual Studio中執行。
隨着一些位魔術:
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
),並檢查其高位是零還是一位。
您必須知道int
的寬度(值的位數)才能決定。
您還必須在格式字符串末尾輸入\n
以確保有輸出。
查看該值是否小於0x80,0x8000,0x80000000或0x8000000000000000,具體取決於類型的位深度。如果它小於那麼它是正數,否則是負數。
如果第一位(符號位)爲1,則該值爲負值。否則,這是積極的。
順便說一句,與正數的數量相比,還有一個負數。
0xDEADBEEF
大於系統上的INT_MAX
(0x7FFFFFFF
),因此轉換爲int
是實現定義的。常見的二進制補碼實現將其定義爲將模2*INT_MAX+2
簡化爲範圍[INT_MIN,INT_MAX]
。
你的意思是你想識別打印的整數是正數還是負數? –
是的,在gcc中運行它:D –