1.初認識JVM

3759 ワード

JVMの概念
省略する
JVM発展の歴史
省略する
JVM種類
省略する
Java言語仕様
主に文法、変数、タイプ、文法などの情報を定義します.
省略する
JVM仕様
主にClassファイルタイプ、ランタイムデータ、禎桟、仮想マシンの起動、仮想マシンの命令セットなどの情報を定義します
Java言語とJVMは相対的に独立している(以下の言語はすべてJVMを使用し、JVM仕様に合致する)
  • Groovy
  • Clojure
  • Scala

  • 1.整数の表現()
  • 原号:第1ビットは符号ビット(0は正数、1は負数)
  • 反符号:符号ビット不動、原符号取反
  • 負数符号:符号ビット不動、逆符号1
  • -6
      : 10000110
      : 11111001
      : 11111010
    
    -1
      : 10000001
      : 11111110
      : 11111111
    
  • 正数符号:原符号と同じ
  • 5
    00000101
    
  • 印刷整数のバイナリ表示
  • int a=-6;
    for(int i=0;i<32;i++){
        int t=(a & 0x80000000>>>i)>>>(31-i);
        System.out.print(t);
    }
    
    

    2.なぜ補コードを使うのですか.
  • 曖昧な表現0(正数としても負数としても)
  • がない.
    0
      :00000000
    
      :10000000
      :11111111
      :00000000
    
    
  • ソースコード計算は所望の結果を得ることが困難である.符号化演算、シンボルビットが演算に関与することで、正しい結果が得られる
  • .
    -6+5          -4+5
      11111010      11111100
    + 00000101    + 00000101
    = 11111111    = 00000001
    

    3.floatの表現と定義
    詳細はこのフォルダの下のファイルを参照してください:floatの表示
    s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
    指数:8端数:23
    e全0端数付加ビットが0でなければ端数付加ビットが1
    s * m * 2^(e-127)
    さぎょう
  • 補符号については、補符号の利点を簡単に述べる.-99,-105,205の整数を与える符号化
  • を計算する.
    答え:a.曖昧な表現がなくても0を表すことができる.
    0   
      、   00000000
    
    0   
       10000000
       11111111
       00000000
    

    b.原符号を用いた計算では所望の結果が得られない可能性があるが、補符号を用いてシンボルビットが演算に関与して正確な結果を得ることができる.
    -99                 -105                205
       1110,0011         1110,1001       0000,0000,1100,1101
       1001,1100         1001,0110
       1001,1101         1001,0111
    
  • 浮動小数点数については、IEEE 745に従って、11000001000010000000000000の単精度浮動小数点の値を計算し、計算プロセスを与える.

  • 答:式はs*m*2^(e-127)
    e=1000,0010=2^1+2^7=130
    m=1+2^-3=1.125
    v=-2^(130-127) * 1.125=-9
    

    3.Javaプログラムを書き、100.2をIEEE 745バイナリ表現に変換し、プログラムと結果を与える.
        /**
         *     double  IEEE745     
         * @param d        
         */
        public static void printDouble(double d){
            //       
            StringBuilder dStr = new StringBuilder();
            
            /* 1.     d                  */
            int integer = (int) d;  //   
            double decimals = d - integer;  //   
            System.out.println("    : " + decimals);
            //         
            String integerStr = Integer.toBinaryString(integer);
            //         
            StringBuilder decimalStr = new StringBuilder();
            int count = 32; //     32 
            for (int i = 0; i < count; i++) {
                decimals = decimals * 2;
                if(decimals > 1){   //     1
                    decimalStr.append(1);
                    decimals -= 1;
                }else{  //     0
                    decimalStr.append(0);
                }
            }
            System.out.println("         : " + integerStr);
            System.out.println("         : " + decimalStr);
            
            /* 2.       */
            dStr.append(d > 0?0:1);
            
            /* 3.                   */
            /* 4.        127        e  */
            if(integer > 0){    //     ,     
                //                   
                int bit = integerStr.length() -1;
                dStr.append(Integer.toBinaryString(bit + 127)); //  e 
                decimalStr.insert(0, integerStr.substring(1));   //                   
            }else{  //     ,     
                //       
            }
            
            // 5.      23    m 
            dStr.append(decimalStr.subSequence(0, 23)); //  m 
            System.out.println("100.2 IEEE745      : " + dStr);
            
        }
    

    出力結果:
             : 1100100
             : 00110011001100110011001100110011
    100.2 IEEE745      : 01000010110010000110011001100110