整形と浮動小数点型の計算機における記憶
4720 ワード
*整形
整形:(char,int,unsigned char,unsigned int...)整形は、符号付き整形と符号なし整形に分けられる.記号付き整形記号付き整形コンピュータに直接彼の元のコード(この数を2次制数に変換するバイナリコード)を格納します.例えば、
unsigned int a = 0;
a = 9;
//a 9 1001, : 1001
これはint型であるため、コンピュータは4バイトを開いて記憶し、記憶フォーマットは:0000 0000 0000 0000 0000 0000 0000 1001 aがcharタイプであれば1バイトを開いて記憶し、記憶フォーマットは:0000 1001である.これにより、int型とchar型に明らかな最大記憶値(すなわち、すべてのbitビットが1)があることがわかる.int 1111 1111 1111 1111 1111 1111 1111 1111(232−1)char 1111 1111(28−1)従ってunsigned intの記憶範囲は[0232−1]であることが分かる.unsigned charの記憶範囲は[0,28−1]である.
無記号整形ここでは、逆符号、補符号、無記号整形の格納規定について説明します.符号なし整形規定開バイトの最初のbitビットは、符号ビット正数を0、負数を1とする.逆符号:原符号の符号ビットは変わらず残りのbitビットはビットで逆をとる.補数:逆符号プラス1(符号ビットが演算に関与する)すなわち、補数=逆符号+1符号なし正数の記憶:符号なし正数が直接その原符号を記憶する(第1 bitビット必須ビット0):
char a = 5;
//a 101, 0000 0101;
符号なしの負数は、次のように、彼の補符号を保持します.
char a = -9;
//a 1000 1001
// :1111 0110
// : 1111 0111
// a :1111 0111
シンボルビットの存在により,コンピュータにシンボル整形が格納されている間に2つの0,すなわち+0(0000)と-0(1000 0000)が現れ,0値が一意でなく,値の一意性を破壊することが分かった.従って、記憶フォーマットが(1000,000,000)の場合、彼は-0を表すのではなく、-128を表すように規定する.コンピュータが符号なし正数を格納する場合、符号ビットは0でなければならないため、符号なし正数の最大値は(0111 1111、127)であるため、charのコンピュータにおける記憶範囲は[-128127]、同理intの記憶範囲は[-2332-12]である.
浮動小数点
浮動小数点型:float,double...浮動小数点型のコンピュータでの記憶フォーマットは(-1)S×M× 2E. 科学計数法がMであるように×10 n同様、後ろのM×2 Eは浮動小数点数をバイナリに変換する科学的カウント法であり,M∈[1,2]、前のSは彼のシンボルビット負数を1正数で0と整形と同じと決定した.コンピュータが格納されているときはS,M,Eの値を見るだけでよい.このうちSが1位、EがSの後ろの8位(2-9位)、M局の残りの23位を占めている.Eに正負があるので、私たちは彼に記号ビットを残していないので、Eが格納されているとき+127、読み込まれているとき-127を規定しています.例:
float 5.0
//5.0 = 101.0 = 1.01*2^2^ = (-1)^0^×1.01×2^2+127^ = (-1)^0^×1.01×2^129^
// :
//0 100 0000 1 010 0000 0000 0000 0000 0000
//S| E | M |
M領域の数は1.01で保存されているのに01であることが分かった.M領域の1つの範囲は1から2であり、最初は必ず1であるため、保存を続ける必要がなく、1バイトの空間を節約する.
Eが全1の場合∞を表し、Eが全0の場合0(Mがいくら取っても)を表し、0を表す.doubleタイプはE,Mのバイト長を大きく(Eが11ビット,Mが52ビット)するだけで,E加算値は1023となり,残りは変わらない.整形と浮動小数点型の例を挙げて説明します.
//
int a = -5;
printf("%u",a);
//a = -5 1111 1111 1111 1111 1111 1111 1111 1011
// , 1111 1111 1111 1111 1111 1111 1111 1011
// a = 4294967291
//
float a = -5.0;
int *p = &a;
printf("%d",*p);
//a = -5.0 1100 0000 1010 0000 0000 0000 0000 0000
// p , &a, 32 p, p 4
// *p = 1100 0000 1010 0000 0000 0000 0000 0000
//1011 1111 0101 1111 1111 1111 1111 1111 + 1
//1011 1111 0110 0000 0000 0000 0000 0000
// :-1063256064