2011-09-01 326 views
3

你們可以請解釋一下下面的程序按位補運算符

int main() 
{ 
int max = ~0; 
printf("%d\n",max);  
return 0; 
} 

AFAIK〜會翻轉位。在這種情況下,即〜0將把所有位設置爲1.所以max變量應該包含MAX值,但是我將o/p設置爲-1。所以任何人都可以在這裏告訴我爲什麼我得到o/p爲-1。

回答

6

你爲什麼期望獲得「最大值」?在2的補碼有符號表示中,全1位模式代表-1。這只是它的方式。

以2的補碼有符號表示的最大值由01111...1位模式表示(即第一位是0)。你得到的是1111...1,由於第一位符號位是1,所以顯然是負數。

如果你想去的地方補零產生「最大值」的一個例子,使用無符號表示

int main() { 
    unsigned max = ~0u; 
    printf("%u\n", max);  
} 
+0

注意,變量/表達的兩種類型**和**格式指示符('%u')必須同意爲這也工作。如果他們不匹配,你有未定義的行爲。 –

1

這是正確的輸出,因爲您使用的是簽署了int數據類型。你需要閱讀有關二的補碼否定表達。所有一位不是最大負值,它是程序輸出時的-1。最大負數有符號值是最重要的位設置,所有其餘的位爲零,在32位情況下爲0x80000000。在32位情況下,最大正符號值爲0x7fffffff。

1

以上答案已經涵蓋了值爲-1的~0背後的原因。

如果你正在尋找的最大整數值,那麼你可以包括limits.h中庫,並使用該庫

INT_MAX給你最大的帶符號整型值聲明的常量。 UINT_MAX爲您提供了最大的無符號整數值。

#include <stdio.h> 
#include <limits.h> 

int main() 
{ 
printf("Max signed int value: %d \n", INT_MAX); 
printf("Max unsigned int value: %u \n", UINT_MAX); 
return 0; 
} 
0

這個問題是很久以前的事,但對後人的緣故:
它可以幫助你看到它更好,如果你打印〜0既是int和十六進制如下:

printf("compliment of zero %d\n", (~0)); 
printf("compliment of zero 0x%x\n", (~0)); 

輸出:
稱讚的零 -1
稱讚的 零的0xffffffff