原碼(使用者的角度):原始的二進位制
1、使用者的數字分為正負數,符號位的儲存
2、最高位為符號位:0代表為正數,1代表為負數
3、1000
0000 左邊是高位, 右邊是低位
1,+1: 0000
0001
-1: 1000
0001
+0: 0000
0000
-0: 1000
0000
原碼儲存導致2個問題:
1、0有兩種儲存方式
2、正數和負數相加,結果不正確(計算機只會加不會減)
以原碼來算
1-1=1+-
11: 0000
0001
-1: 1000
0001
1000
0010=-
2
反碼(為了算補碼):
1、正數的原碼和補碼一樣
2、求原碼
3、(負數)在原碼的基礎上,符號位不變,其它位取反(0變1, 1變0)
1,+1: 0000
0001
-1: 1111
1110
+0: 0000
0000
-0: 1111
1111
反碼儲存導致1個問題:
1、0有兩種儲存方式
以反碼來算:
1-1=
1+-1
1: 0000
0001
-1: 1111
1110
1111
1111=-
0計算機儲存數字以補碼方式儲存(為了解決負數的儲存)
補碼:
1、正數的原碼、反碼、補碼都一樣
2、補碼為其反碼+
13、補碼符號位不動,其它位求反,最後整個數+
1,得到原碼
1,+1: 0000
0001
-1: 1111
1111
+0: 0000
0000
-0:10000
0000 (最高位丟棄)=
0000
0000
以補碼來算:
1-1=
1+-1
1: 0000
0001
-1: 1111
1111
10000
0000(最高位丟棄) =
0000
0000
10進製數,站在使用者的角度,原碼
二進位制、八進位制、十六進製制數,站在計算機角度,補碼
在計算機系統中,數值一律用補碼來儲存,主要原因:
1.統一了0的編碼
2.將符號位和其他位統一處理
3.將減法運算轉變為加法運算
4.兩個用補碼表示的數相加,如果最高位(符號位)有進製,則進製被捨棄
原碼求補碼:
1)最高位符號位,其它位就是二進位制(原碼)
2)在1)基礎上,符號位不變,其它位取反
3)補碼在2)基礎上加1
補碼求原碼:
1)補碼
2)求補碼的反碼,符號位不變,其它位取反
3)原碼在2)基礎上加1
例: //乙個位元組
1000
0001
0x81
//二進位制、八進位制、十六進製制數,站在計算機角度,補碼
//0x81轉化為二進位制1000 0001,最高位為1,說明是負數
char a = ox81;
補碼:1000
0001
反碼:1111
1110
原碼:1111
1111=-
127//10進製數,站在使用者的角度,原碼
printf
("%d\n"
, a)
;// -127
//10進製數,站在使用者的角度,原碼
int a =
-123
; 原碼:1000
0000
0000
0000
0000
0000
0111
1011
反碼:1111
1111
1111
1111
1111
1111
1000
0100
補碼:1111
1111
1111
1111
1111
1111
1000
0101
%x: f f f f f f 8
5//%x, 預設以4個位元組(32bit)大小列印
//二進位制、八進位制、十六進製制數,站在計算機角度,補碼
printf
("%x\n"
, a)
;// ffffff85
資料型別範圍(站在10進製角度,原碼)
char
1個位元組(8位)
有符號範圍:
正數:0000
0000
~0111
11110~
127 負數:
1000
0000
~1111
1111-0
~-127-
0 當做 -
128 使用
-128:
原碼: 1
1000
0000
反碼: 1
0111
1111
補碼: 1
1000
0000
-128
~127
無符號:
0000
0000
~1111
11110~
255char:
有符號:-
128~
127無符號: 0
~255
賦值或則越算,記得不要越界:
char ch =
127+2;
/* 129:
補碼:1000 0001
反碼:1111 1110
原碼:1111 1111
*/4[
printf
("%d\n"
, ch)
;// -127
unsigned char b =
255+2;
//257轉化為二進位制 0001 0000 0001 (只取8位)0000 0001 --> 1
printf
("%u\n"
, b)
;// 1
原碼 反碼 補碼
正數 原碼 反碼 補碼一樣 7 原 0 0000111 b 7 反 0 0000111 b 7 補 0 0000111 b 負數 原碼就是原來的表示方法 反碼是除符號位 最高位 外取反 補碼 反碼 1 7 原 1 0000111 b 7 反 1 1111000 b 7 補 1 1111001 b 當...
原碼 反碼 補碼
正數 原碼 反碼 補碼一樣 7 原 0 0000111 b 7 反 0 0000111 b 7 補 0 0000111 b 負數 原碼就是原來的表示方法 反碼是除符號位 最高位 外取反 補碼 反碼 1 7 原 1 0000111 b 7 反 1 1111000 b 7 補 1 1111001 b 當...
原碼 反碼 補碼
數值在計算機中表示形式為機器數 計算機只能識別0和1,使用的是二進位制,而在日常生活中人們使用的 是十進位制,正如亞里斯多德早就指出的那樣,今天十進位制的廣泛採用,只不過我們絕大多數人生來具有10個手 指頭這個解剖學事實的結果.儘管在歷史上手指計數 5,10進製 的實踐要比二或三進製計數出現的晚.摘...