int a 2 printfu ,a 輸出為 65534 為什麼?麻煩解釋一下!!謝謝

時間 2021-06-25 15:00:10

1樓:風若遠去何人留

出現這種情況, 是用的16位編譯器. int佔2位元組.

賦值int a=-2; 補碼形式儲存, 實際儲存為0xfffe用%u輸出, 會轉為無符號數(unsigned int)也就是輸出0xfffe為原碼的正數值, 即65534

2樓:三笑牌拳頭

printf("%u",a)中u是unsigned int的意思,即無符號數,如果你輸printf("%d",a)就會輸出-2了。

int a = -2在記憶體裡以補碼形式表示就是65534,符號數是一種輸出形式,無符號數是另一種輸出形式。

3樓:滬上新視界眼科

整形2在計算機中16二進位制表示為:0000 0000 0000 0010

所以-2用2的補碼錶示為:1111 1111 1111 1110

(最高位用0表示正數,用1表示負數,-2即為將2的最高位變為1,將剩餘位數取反,結果數加1,具體參看補碼的表示方法)

由於輸出時採用%u限制格式,用無符號表示,而1111 1111 1111 1110即表示65534(=2^16-2)

(1 0000 0000 0000 0000=1111 1111 1111 1110+1+1)

4樓:葉子草

%u為以無符號十進位制輸出。無符號整數能表示的數範圍是0-65535,即對應的二進位制數0-1111111111111111(16個1)。

int a=-2;a為有符號的整型,以1111111111111111(16個1)的二進位制數儲存。(-2二進位制表示為10000000000000010,負數在計算機中用補碼錶示,即1111111111111110)。如果用%d輸出a,則為-2,但是轉換成無符號整數%u輸出,1111111111111110(原來的有符號整數-1)被解釋成1111111111111110(無符號整數65534),輸出結果為65534

5樓:匿名使用者

補碼知道不是什麼東西

c語言中:unsigned int a=-2;printf("%u",a);輸出結果為多少?

6樓:

在16位int平臺下,輸出是65534;在32位int平臺下,輸出是4294967294。以32位int平臺為例,題中的unsigned int a=-2;語句在unsigned的修飾下,賦給變數a的是-2補碼的無符號值,即4294967294。但後面的printf("%u",a);的輸出並不與a是否為有符號數沒有關係,輸出是否為有符號數由"%u"中的控制符%u決定,這裡%u表示將變數a按無符號數輸出,所以輸出是4294967294。

因此,如果將unsigned int a=-2;改為int a=-2;,printf("%u",a);同樣輸出4294967294。即使是unsigned int a=4294967294;這樣定義a,用printf("%d",a);輸出就是-2;因為輸出是由控制符%d決定的。

7樓:頹廢前進

輸出結果為65534或者4294967294

因為在不同位的作業系統下,數值的表示位數是不一樣的。首先我們先明確一點:在計算機中,正數用原碼來計算(正數的原碼、補碼、反碼都是一樣的);負數是用補碼來計算的。

至於原因可以參考一下文章網頁連結就是把減法簡化為加法從而大大簡化計算機電路的過程。

首先在16位系統中,-2的原碼為1000 0000 0000 0010;補碼為:1111 1111 1111 1110;我們使用的unsigned為無符號數,那麼此時計算機會把我們的-2強制轉化為正數進行運算,即用1111 1111 1111 1110表示-2,即為65534.

在32位作業系統中,-2的原碼為:1000 0000 0000 0000 0000 0000 0000 0010;補碼為:1111 1111 1111 1111 1111 1111 1111 1110;同上述,計算機會強制輸出1111 1111 1111 1111 1111 1111 1111 1110所代表的十進位制數,即4294967294。

#include

#include

void main()

輸出結果:

65535   65535

-2   4294967294

8樓:

應該是4294967295-2+1=4294967294

因為unsigned int a=-2;這句會強制把負數,轉換成正數

9樓:匿名使用者

在vc等32位編譯系統上-2的補碼是11111111111111111111111111111110

若解釋為unsigned int則為4294967294

同理unsigned int a=-2;printf("%d",a);雖然定義a是unsigned型別,但printf();函式中解釋為int型別,輸出結果還是-2。記憶體中的2進位制資料不同的解釋方式,有不同的顯示結果。

10樓:

unsigned int 為 0--655351111 1111 1111 1111 為 65535-2用補碼錶示

1000 0000 0000 0010 取反加11111 1111 1111 1110

結果為 65534

11樓:匿名使用者

看你的機器是多少位的,32位的和64位的結果是不同的

main() {int a=2,b=5; printf("a =%%d,b=%%d,a,b); },輸出的結果為什麼a=%d,b=%d呢?我一直搞不懂,謝謝!

12樓:

由於單個的%有別的用處,所以要輸出單個%時必須雙寫成%%,顯然上例中%%d就只輸出%d了;按c/c++“貪心法”%%d被解釋成(%%)d而不會解釋成%(%d)。如果想達到輸出“%d”的效果,得寫成%%%d才可以,這就被解釋成(%%)%d了,最後輸出就是%x形式。如:

#include "stdio.h"

int main(int argv,char *argc)輸出樣例:

13樓:匿名使用者

%符號會將它後面的一個字元轉義,比如%d就代表數字,%s代表字串,而%%就代表%字元

第一個%是轉義符號,第二個%是告訴printf函式要輸出%

int a 3,b 2,c 1 c 5 abprintfd n ,c 輸出為什麼是3啊?求大神指點

因為c 5永遠是 真 所以執行?後的a 而a 是後 要把a的值3賦給c後a才變為4。 單屏安 c 5這個條件為假,應該執行b 得b 1,但是最後輸出為c,c不變,應該是c 1 飛向夢想飛向未來 c語言提供一種特殊的運算子 逗號運算子。用它將兩個表示式連線起來。如 3 5,6 8 稱為逗號表示式,又稱...

已知定義int a 2,則表示式a a a a a的值是

這個表示式無意義,編譯器會給出警告資訊。該表示式的值與編譯器相關 非要執行,看一下這句在gcc給出的反彙編 0x401476 mov eax,0x1 0x40147b sub eax,dword ptr esp 0xc 0x40147f mov edx,dword ptr esp 0xc 0x401...

若有定義 int a 3,b 2,c 1並有表示式 a b,abc,b c 1,c 1,則表示式值相等的是哪兩個

你是誰會想 表示式一值為1,表達二好象有錯誤,不能那樣表示,應寫成a b b c,這樣寫二式為真,值為1,三式且符號兩邊都非零,都為真,所以三式值為2,四式為賦值語句,最終結果是c的值為2 湯福書屋 第一個 a b 輸出結果為 1 第二個 a b c為真,3 2為真 即為1,但1 1為假 即為0第三...