ソースコード、インバースコード、補完コード(超詳細解析)

目次

1.基礎知識の補足

   (1) コンピュータ言語表現:

    (2) コンピュータの基本単位とデータ型:

    (3) 2進数

2、ソース コード、逆コード、補数コード

(1) コンセプト

(2) 理解する

    1. ソースコード

    2.逆コード

    3.補完する

三、相互励まし


1.基礎知識の補足

   (1) コンピュータ言語表現:

    現代のコンピューターは主にデジタル集積回路が使われていますが、デジタル回路は高低で0と1しか表現できないため、コンピューターは0と1しか認識できないようですストレージであろうとコンピューティングであろうと、コンピュータはバイナリ システムを使用して完成されます。

    例: 10 進数4 ---------- 2 進数で100として表される

    (2) コンピュータの基本単位とデータ型:

    1.ビット------------ビット

    2. バイト ---------- バイト------------- 1byte = 8bit

    3. KB ------------ キロバイト---------- 1KB = 1024byte

    4. MB ----------- 兆 ---------------- 1MB = 1024KB

    5. GB ----------- ギガバイト---------- 1GB = 1024MB

    6. TB ----------- テラバイト---------- 1TB = 1024GB

    7. PB ----------- ペタバイト ----------- 1PB = 1024TB

その中で、C 言語の特定のデータ型ストレージには、特定の範囲もあります。

   1. char -------- 1 バイト 2. short --------- 2 バイト

    3. int -------- 4 バイト 4. long ---------- 4 バイト

    5. long long -------- 8 バイト 6. float ---------- 4 バイト

    7.double ---------- 8 バイト

    (3) 2進数

    コンピューターにおける数値の 2 進数表現は、機械数とも呼ばれます。2 進数には次の 2 つの特徴があります。

    1. 2 進数は符号付き、つまり正と負の数です。このうち、正の数の場合は最上位桁に0を、負の数の場合は最上位桁に1を表示します。

    2. 通常、バイナリ ビットはデータ型によって制限されます。たとえば、char 型は 1 バイトあたり 8 ビットです。

    例: int 2 ; ------------------ バイナリ表現: 00000000 00000000 00000000 00000010

2、ソース コード、逆コード、補数コード

(1) コンセプト

    1.適用範囲:ソースコード、補数コード、補数コードは整数のみに適用可能:正の整数、負の整数

    2. 正の整数:ソース コード = 補完コード = 補完コード

    3. 負の整数:負の数の場合、ソース コードの符号ビットを変更せずに保持し、残りのビットを反転して反転コードを取得します。

                              負の数の場合は、逆コードを追加します。1、補数を得る

    例: int a = 3;

int a = 3 ; // int整型为4字节,32个bit位
//源码:00000000 00000000 00000000 00000011
//反码:00000000 00000000 00000000 00000011
//补码:00000000 00000000 00000000 00000011
//因为是正整数所以 源码=反码=补码

    例: int a = -3;

int a = -3 ; // int 为整型4个字节32个bit位
//因为是负数,所以最高位是 1
//源码:10000000 00000000 00000000 00000011
//源码符号位不变,其余各个位按位取反,得到反码
//反码:11111111 11111111 11111111 11111100
//反码+1,得到补码
//补码:11111111 11111111 11111111 11111101

    4. 重要な違い: 整数式の計算では、メモリ内の補数コードが使用されます。

                         印刷されて見えるのはソースコードです。

(2) 理解する

    私が勉強を始めたときと同じ考えを持っている人は多いと思いますが、コンピュータはバイナリをそのまま使えばいいのに、なぜソースコード、逆コード、補数コードを区別する必要があるのでしょうか。実際、コンピュータの場合、足し算の実装は比較的簡単ですが、逆に、引き算は少し複雑です. 借用ロジックを考慮する必要があります. これは実装が難しく、効率が低すぎます. ゆっくりと, 減算器が置き換えられます.加算器によって、アルゴリズムをより単純かつ効率的にします。

    以下では、ソース コード、逆コード、および補数コードを順に分析し、2 項演算で補数コードが使用される理由を説明します。

    1. ソースコード

正の整数のソース コード = 逆コード = 補コード であるため    、ソース コードを使用して正の整数の加算を計算する場合は問題ありません

    例: 2 つの正の整数を足すと、2 進数で 10 になります

int a = 5 ;  // int为4字节32个bit位 
int b = 5 ;  // 00000000 00000000 00000000 00000101  --二进制
int sum=0 ;
sum = a + b ;  // 00000000 00000000 00000000 00000101
               // 00000000 00000000 00000000 00000101   相加
// 此时sum = 10 
               // 00000000 00000000 00000000 00001010  ---二进制  

    このとき、負の整数を使用して計算および加算します。

int a = 3;   // 00000000 00000000 00000000 00000011  3的源码=反码=补码
int b = -2;  // 10000000 00000000 00000000 00000010  -2的源码
             
int sum = 3 + (-2) ;  //相加
             // 10000000 00000000 00000000 00000101   此时结果为-5 

    2.逆コード

    逆コードの場合、ソースコードでは減算演算を実現できないという問題を実際に補っていますが、最上位ビットが繰り上げられ、下位ビットを 1 加算する必要があり、計算効率が大幅に低下します。この時。

    例: 3+(-2) を計算し、結果が 1 であることを確認します。

int a = 3 ; // 00000000 00000000 00000011  源码=反码=补码

int b = -2 ;// 10000000 00000000 00000010  -2的源码
            // 11111111 11111111 11111101  -2的反码

//此时将两个反码相加
  
            // 最高位多出的(1) 100000000 00000000 00000001  --1

    例: 1+(-1) の計算

int a = 1 ;  // 00000000 00000000 00000000 00000001   源码=反码=补码
int b = -1 ; // 10000000 00000000 00000000 00000001   -1的源码
             // 11111111 11111111 11111111 11111110   -1的反码 

// 此时让 a+b 两个反码相加
             // 11111111 11111111 11111111 11111111      结果也为0 

この場合、この時点で11111111 と 00000000 の両方が 0 である    ことがわかり、コンピューターで判断することは困難です。したがって、逆コードは足し算と引き算を実現できますが、欠陥があり非効率的であると結論付けられます。

    3.補完する

    補数コードは、コンピューターのバイナリ、コンピューティング、およびストレージのエンコード形式に適用され、同時にソース コードと逆コードの欠陥を解決します。このうち、上位ビットがオーバーフローした場合は、直接破棄できます。

    例: 3 + (-2)

int a = 3 ;  // 00000000 00000000 00000000 00000011 源码=反码=补码
int b = -2 ; // 10000000 00000000 00000000 00000010   -2的源码
             // 11111111 11111111 11111111 11111101   -2的反码
             // 11111111 11111111 11111111 11111110   -2的补码

//此时两个数的补码相加
             // 100000000 00000000 00000000 00000001 最高位溢出一个1,直接丢弃
     //最终结果  00000000 00000000 00000000 00000001   ----1

    例: 1+(-1)

int a = 1 ;  // 00000000 00000000 00000000 00000001 源码=反码=补码 
int b = -1 ; // 10000000 00000000 00000000 00000001   -1的源码
             // 11111111 11111111 11111111 11111110   -1的反码
             // 11111111 11111111 11111111 11111111   -1的补码

//此时两个数的补码相加
     //最终结果:100000000 00000000 00000000 00000000  做高位溢出一个1 ,直接丢弃
     //最终结果:00000000 00000000 00000000 00000000  ----0

    最後に、0を出力することは非常に正確であり、逆コードほど面倒ではありません.このとき、補数コードは、加算および減算演算を実現できるだけでなく、アルゴリズム演算もより単純であり、計算効率が高くなります。

三、相互励まし

    この記事は、コンピューター内のソース コード、逆コード、および補数コードに関する私の理解です. 質問がある場合は、コメント欄で質問してください. 一緒に作業しましょう! ! !

    次号では、この記事をもとにビット論理積、ビット論理和、ビット論理和、シフト演算子の理解を進めていきますので、引き続きご注目いただければ幸いです。! !

おすすめ

転載: blog.csdn.net/weixin_45031801/article/details/126802766