2010-02-11 74 views
-1

的作品我有這樣的一段代碼,你可以給我解釋一下輸出無法弄清楚如何〜運算符在C

unsigned int x=3; 
~x; 
printf("%d",x); 

輸出爲10 我不能讓它如何。

我編上的Turbo C代碼

+2

你真的編寫代碼/編譯並運行它,它給你10嗎?或者你剛剛在某處讀過這些東西? – 2010-02-11 04:22:17

+0

該代碼示例看起來不像編譯。 '〜x'後面有一個缺失的分號。 – 2010-02-11 04:27:59

+1

該代碼將打印'3':http://ideone.com/S9Ht6DfT – 2010-02-11 04:42:15

回答

2

您發佈的代碼不會編譯。如果您將~x更改爲x = ~x;,它會進行編譯,但不會輸出「10」。

~運算符創建給定數字的按位倒數。在二進制中,數字3作爲八位整數由位00000011表示。 ~運營商將用相反的代替這些比特中的每一個,給出11111100,其爲252無符號或-4簽名。

您將x聲明爲unsigned int,這意味着大多數平臺上的32位無符號值。所以你的原始值是00000000 00000000 00000000 00000011,而反過來是11111111 11111111 11111111 11111100或4294967292.

+0

發佈的代碼*將*編譯,它只是不會對'x'做任何事... ... – 2010-02-11 04:42:54

+0

@Mark:不,當JS Bangs寫下他的回答有一個失蹤者; (請參閱有問題的編輯),因此代碼*不會編譯。 – Ramashalanka 2010-02-11 05:06:57

+0

@Ramashalanka,夠公平的。 – 2010-02-11 05:09:08

2

要打印無符號的價值,尤其是操作位時,使用無符號格式printf

printf("%u", x); 

我不知道你」實際上運行你展示的代碼。看到這一點:

#include <stdio.h> 

int main() 
{ 
    unsigned int x = 3; 
    unsigned int y = ~x; 

    printf("Decimal. x=%u y=%u\n", x, y); 
    printf("Hex. 0x%08X y=0x%08X\n", x, y); 
    return 0; 
} 

輸出:

Decimal. x=3 y=4294967292 
Hex. 0x00000003 y=0xFFFFFFFC 

爲什麼值,因爲它們應該是基本的二進制算術(和牢記的是C'S ~操作翻轉其參數的位)明顯。