2016-11-02 15 views
0

は私の方法です: Fl_IN = 1114599018であり、k = 0最後の値が間違っているのはなぜですか?ここ

public void int FL(int FL_IN, int k) { 
    int d0, d1; 
    d0 = FL_IN >> 16; 
    d1 = FL_IN & 0xffff; 
    if (k % 2 == 0) { 
     d1 = d1^(d0 & EK[k/2]); 
     d0 = d0^(d1 | EK[(k/2 + 6) % 8 + 8]); 
    } else { 
     d1 = d1^(d0 & EK[((k - 1)/2 + 2) % 8 + 8]); 
     d0 = d0^(d1 | EK[((k - 1)/2 + 4) % 8]); 
    } 
    System.out.println(Integer.toBinaryString(d0)); 
    System.out.println(Integer.toBinaryString(d1)); 
    System.out.println(Integer.toBinaryString(d0 << 16)); 
    System.out.println(Integer.toBinaryString((d0 << 16) | d1)); 
    System.out.println((d0 << 16) | d1); 
} 

そして、ここでは、出力されます。

1110110010101000 
10111001000110 
11101100101010000000000000000000 
11101100101010000010111001000110 
-324522426 

それは11101100101010000010111001000110は= -324522426それを言っている理由を私は理解していません3970444870

EDIT次のようになります。長いintの代わりに使用して問題を解決し

+0

符号付き整数に収まるか? http://www.binaryconvert.com/result_signed_int.html?hexadecimal=ECA82E46を参照してください。 –

+4

'int'は32ビット**の署名**番号です。値 '3970444870'は大きすぎて32ビットの符号付き' int'に収まらない。バイナリ値「11101100101010000010111001000110」は、「2の補数」(https://en.wikipedia.org/wiki/Two%27s_complement)で「-324522426」に等しい。 – Jesper

+1

これは 'd0'が* signed *整数であるためです。非常に詳細な記事については、[2の補数](https://en.wikipedia.org/wiki/Two%27s_complement)を参照してください。 3970444870を印刷したい場合は、より大きな(64ビット)整数型を使用する必要があります。 「長い」。 –

答えて

0

の整数の範囲は-2,147,483,648 and a maximum value of 2,147,483,647です。この値は範囲3,970,444,870を超えています。

+0

私は ">>"と "<<"演算子を使用することはできません浮動小数点を使用します。それに対処する方法はありますか? –

+0

なぜ浮動ですか?長く使う。 –

関連する問題