オペレーティングシステム:コンピュータ情報処理と表示


本編では、コンピュータの様々な数値表現方法を簡単に紹介します.原コード、逆コード、補コード、浮動小数点数です.
シーケンス
  既存のコンピュータの大部分はバイナリ表現法を用いて数値を表す.単一バイナリはあまり有用ではないが,ビットを組み合わせて何らかの解釈を加えると,異なる可能なビットモードの意味が与えられ,さらに限られた集合を表す.
符号なし符号化は、従来のバイナリ表現法に基づいて、0以上の数字を表す.符号は符号付き整数を表すことができる.浮動小数点数は実数を表す2ビットベースのバージョンです.
符号付き整数は通常、補符号で表され、整数が大きすぎるとオーバーフローが発生し、負の数が発生する可能性がある.浮動小数点数にはまったく異なる数学的属性があり、その整数オーバーフローは特殊な値(正無限または負無限、整数オーバーフローは正無限、負数オーバーフローは負無限)を生じ、2つの正数を乗算すると永遠に正数しか生じず、オーバーフローしても負数は生じない.精度が限られているため、浮動小数点演算時に結合できない.
ジルコニウム正数の表現は比較的小さな数値範囲しか符号化できず、この表現は正確である.一方,浮動小数点数は大きな数値範囲を表すことができるが,この表現は近似にすぎない.
情報の保存
  マシンは、元のコード、逆のコード、補コードを無視し、直接操作するオブジェクトはバイトです.
バイトとワード
  ほとんどのコンピュータは、メモリ内の個別のビットにアクセスするのではなく、最小のアドレス可能なメモリ単位として、8ビットのブロック、またはバイトを使用します.マシンレベルのプログラムは、メモリを仮想メモリと呼ばれる非常に大きなバイト配列と見なします.メモリの各バイトには、そのアドレスと呼ばれる一意の数字があり、すべての可能なアドレスの集合を仮想アドレス空間と呼ぶ.
  C言語のポインタの値(整数、構造、または他のプログラムのオブジェクトを指す)は、あるメモリブロックの最初のバイトの仮想アドレスである.タイプの情報はCコンパイラによって維持されており、生成された世界のマシンレベルのプログラムはデータ型に関する情報をうまく処理していない.マシンレベルのプログラムが向いている操作対象はバイトである(これはポイントで、機械は何の原コード、逆コード、補コードも気にせず、直接操作する対象はバイトです).
各コンピュータには文字長、有名なポインタデータの公称サイズが残っています.仮想アドレスはこのような1文字で表されるので,ワード長が決定する最も重要なシステムパラメータは仮想アドレス空間の最大サイズである.32ビットマシンは最大4 Gの仮想メモリ容量しか利用できません.ほとんどの64ビットマシンは32ビットマシンとしてコンパイルされたプログラムを実行することもできます.これは後方互換性です.プログラムを「32ビットプログラム」または「64ビットプログラム」と呼ぶ場合、その実行するマシンタイプではなく、プログラムがどのようにコンパイルされているかを区別します.(longは32ビットプログラムでは4バイトを指し、64ビットプログラムでは8バイトを指す).
  「標準」サイズと異なるコンパイラ設定に依存する奇妙な行為を避けるために、ISO C 99は、コンパイラと機械設定に従って変化しない固定データサイズのデータ型を導入した.例えば、int 64_t,int32_t等.
  ほとんどのマシンでは、マルチバイトオブジェクトは連続したバイトシーケンスとして格納され、オブジェクトのアドレスは使用されるバイトの最小アドレスである.
大端法、小端法
  一部の機械はメモリに最低有効バイトから最高有効までの順序でオブジェクトを格納する.他の機械は逆です前者を下端法,後者を大端法と呼ぶ.両者には明らかな優劣の区別はない.私たちが今使っているほとんどのPCは、小さなエンドメソッドを使用しています.△大端法、小端法の命名については、「グレブ旅行記」で卵を食べるときに大きな端を破るべきか、小さい端を破るべきかという議論があるという.
     0x0012AB9F   :
  :     ->    
  : 00 12 AB 9F
  : 9F AB 12 00

プログラムを使用して、数値が大端法で表されているのか、小端法で表されているのかを確認できます.
// pt          ,len         
void show(unsigned char *pt, size_t len) {
    size_t i;
    for (i=0; i < len; i++) {
        //              
        printf(" %.2x", start[i]);
    }
    printf("
"); } int main() { int32_t val = 0x0012AB9F; show((unsigned char *)&val); }

文字列の表示
  C言語の文字列はnull(その値が0)文字で終わる文字配列として符号化される.
オリジナルコード
  直接数値を用いたバイナリ表現は原符号である.数値3の元のコードは:0101です.元のコードは、シンボルビットとして最上位ビットを使用します.
  nビットの元の符号が表すことができる数値範囲は、[−[2(n−1)−1]、2^n(−1)−1]であり、8ビットの元の符号のように[−127127]を表すことができる.
+3 = 0011
-3 = 1011
+0 = 0000
-0 = 1000

  元符号表現法では,0には2つの表現があることが分かった.これはコンピュータにとって友好的ではありません.(機械の操作対象はバイトであり、数値がどのように表示されるかは関係ありません.私たちの期待では、式「0+1」の結果は「1」であるべきです.が、マシンが1000に1を加えると、結果は0のままで、-0から+0になるだけです.)また,この表現法は,0には2つの表現方法が必要ではないという数値表現を浪費している.
ぎゃくコード
 逆符号化は数値記憶の一種であり、linuxプラットフォームのディレクトリやファイルのデフォルト権限の設定などのシステム環境設定に使用されることが多い.
ほすう
  补码很好的解决了原码的不足之处:解决了原码中0存在两种表示方式的问题.最も重要なのは,符号化が数値の正負属性を機械に隠すことである.(符号を補って数値を機械的に見ても負ではない数にする).
符号の表示
  nビット符号の表現範囲は,[−2^(n−),2^(n−1)−1]である.8ビットのような補符号は[−128,127]を表すことができる.
  • 補数で最小値は10...0、最大値は01...1.
  • オーバーフロー:7+1=0111+0111=1000=-8
  • 2^nを符号化モジュールと呼ぶ.1つの数値の符号化プラスkとマイナス(2^n−k)の結果は同じである.例えば、4ビットの補符号のモードは8である.7の補符号は0111として表され、3:0111+0011=1010を加えると、すなわちオーバーフローは-6となる.7マイナス(16-3)すなわち7-13=0111-1101=1010(13の補符号は1101を表す).
    機械から見れば、すべての数字を加減するのは簡単なバイナリ加減で、正負の区別はない.符号化された表現はちょうど1つのサイクルを構成し、連続的であることを示す(1つのクロックは、正負の区別がない).
    符号化の連想について
      C、C++などのほとんどの言語では記号がサポートされています(デフォルト)と符号なし整数.Javaでは符号数のみがサポートされています.氏度がより広範な原因.  同様に、補符号も機械にすべての正負の定義を遮蔽させ、機械から見れば、すべての数字は正数であり、最小値は1000(熱力学の最低温度が0ケルビン度のように)であり、正数に従って演算するだけで、演算結果を人間の数値定義と解釈すればよい.
    ほすうのかいせき
    符号化は、正数で演算するだけで、演算結果を人間の数値定義として解釈すればよい.解析とは、補コードを元のコードに変換して人間に表示すればよい(私たちの機械には、補コードを元のコードに変換するための回路がある):
  • 符号の符号ビットが「0」であれば、正数であることを示し、その元の符号が符号である.
  • 符号の符号ビットが「1」であれば、負数であることを示し、最高ビットを除くすべてのビットを逆加算するだけで元の符号を得ることができる.

  •   この変換ステップは、元の符号を補符号に変換するステップと全く同じであることを発見した.したがって,1つの回路を用いるだけで,補符号と原符号を互いに変換することができる.
      可见,补码的使用,使得机器对数值的运算和解析都十分方便.
    浮動小数点数の表示
  • sシンボルビット
  • M:端数
  • E:階層番号
  •   数値解釈:V=(−1)^s(1+f)2^(E−bias)であり、biasは2^(k−1)−1である.kはEのビット数である.バイアス量biasを用いると,数値をより滑らかにすることができる.
    表すことができる浮動小数点数は均一に分布していないが,原点に近づくほど稠密になり,すなわち0に近い数ほど,我々の表現誤差は小さくなる.いくつかの大きな数は正確に表現できません.最も近い数値でしか表現できません.
    浮動小数点数の詳細な説明は面倒で、しばらく紹介しません.
    原文:https://blog.givenzeng.cn/book/computer_system/chapter_2/