1. 剛接觸c語言 是說輸入的時候 電腦當做補碼 然後輸出原碼嗎
「輸入的時候 電腦當做補碼 然後輸出原碼」 這樣說是不正確的。
計算機存儲整型數據都是採用補碼來表示的。用補碼
1.解決了+0,-0的問題,
2.所有的運算都可以採用加法來實現
我們在輸入數據的時候,都是人現實生活中能理解的數:如,10進制數,計算機在存儲的時候會自動轉換成補碼來存放和運算。 輸出時,又會按人的要求,自動轉換成相應的可識別的數據來顯示。
short在32位以上的機器上占兩個位元組,是個有符號數,能表示的數據范圍為:-32768~32767。你輸入65535,走出它的表示範圍,計算機中存儲的是16個1,對於short類型,16個1表示的是-1,所以,你的輸出是-1
2. 在C語言中,整數的數值是以補碼形式存放的,補碼是什麼意思啊
使用補碼代表負數,就可以把減法,轉化為加法運算。
那麼,在計算機中只要有一個加法器,就可以做加、減法了。
使用補碼的意義,就是簡化了計算機的硬體。
常識:時鍾倒撥 3 小時,可以用正撥 9 小時代替。
怎麼計算,自己推導吧。
--------
兩位十進制數,共有 100 個數字:00~99。
那麼,減一,就可以用 +99 代替:
25-1 = 24
25 + 99 = (1) 24
取後兩位,忽略進位 100,結果,不就是相同的嗎?
只要利用一個「較大的正數」代替負數,就能把減法變加法了。
這個較大的正數,就是負數的補數。
計算公式:-1 的補數=100-1 = 99。
-2 的補數=100-2 = 98。
。。。
--------
計算機中,使用的是二進制。
二進制的補數,就改稱為:補碼。
八位二進制數,共有 256 個數字:0000 0000~1111 1111。
那麼,-1 的補碼就是 1111 1111 = 255(十進制)。
同理,-2 的補碼就是 1111 1110 = 254(十進制)。
。。。
最後,-128的補碼就是 1000 0000 = 128(十進制)。
計算公式:負數的補碼=【256+這個負數】
零和正數,不需要求補數(補碼),直接計算即可。
3. C語言負數的補碼怎麼轉換的如-12345怎麼轉化為53191的
這是有符號和無符號數值的理解,這個數在內存中的值是一樣的。
二進制
1100
1111
1100
0111
如果按有符號位進行表示就是:-12345
如果按無符號的整數來理解,表示後就是:
53191
轉換代碼:
int
x=
-12345;
printf("%d
%d\n",x,(unsigned)(x&0xffff));
補充
對於你說的問題,可以先看-1補碼
我們先看-1絕對值的二進制是0000
0001(對於把為存儲)
第一位是符號
接下來去補碼為取反操作:1111
1110
在加1
的1111
1111
4. C語言原碼補碼問題
你的這個是16的,我可以給你用8位解釋一下(原理是一樣的,我打起來比較方便~)
我們知道,8位二進制的補碼表示範圍是-128~127對吧。
而在計算機中數據都是以二進制補碼進行存儲的,那麼-128的存儲方式就是1000 0000,而它是沒有原碼和反碼的,所以你不太能驗證,對吧。
這是因為在計算機中,為了溢出特意定義的一個小玩意兒~
所以放到16來解釋,它的最小值也是-32768。
但這已經是最小的數了,再減就會溢出……(理論上是這樣的)
但是現實中的程序編譯有一定的容錯性,只要到了一定的計算機承認的位數就變成-1了。
這是因為計算機中的數好像一個輪回……
(我的計算機是32位的~)
經過實踐驗證了我說的東西……
如果你的程序要求指定了16位,那麼就是-1,如果高於16位,就是 -32769。