2011-06-21 12 views
0

2バイトの配列があります。 private byte [] mData;符号なしの値を持つJava - 奇妙なエラー

と方法:第二のassertメッセージ "255を期待したが、-1" で失敗し

public void testWord() { 
     Word word = new Word(); 
     word.setWord((short) 0x3FFF); 

     Assert.assertEquals(0x3F, word.getByte(0)); 
     Assert.assertEquals(0xFF, word.getByte(1)); 
} 

public void setWord(final short pData) { 
     mData[0] = (byte) (pData >>> 8); 
     mData[1] = (byte) (pData); 
} 

私は簡単なテストを書きました。 私が知っている0xFF signed shortは、実際は-1ですが、なぜJUnitはそれらが等しくないのではないかと考えていますか?そして、そのようなクラスを実装する正しい方法は何ですか?

+1

定数 '0xff'はintではありませんか?つまり、2番目の引数は自動的にintにキャストされます。 – biziclop

+0

私は符号なしのintの不足が嫌いです。この質問はそれに関するものです。 http://stackoverflow.com/questions/430346/why-doesnt-java-support-unsigned-ints – aalku

答えて

2

Javaはその、unsigned型をサポートしていない私は通常、この方法でそれを行います255の値を保持することはできません。0xFFの定数値は符号付きのintと見なされ、比較のために0xFFのバイト値も-1のintに変換されます。

リテラル0xFFを1バイトにキャストする必要があります。アサートをAssert.assertEquals((byte)0xFF, word.getByte(1));に変更します。次に、左側は-1と同様に評価されます。

2

biziclopからのコメントは正しいです。 すべて整数コードに指定する数値は、特に指定しない限り整数とみなされます。

に自分の主張を変更し

Assert.assertEquals((byte)0xFF, word.getByte(1)) 

そして、それは細かい渡す必要があります - integerの最初の2つのバイトが byteと見なされますよう。

Bitwize speeking - 基本的には0xFFと書くと、コンパイラはそれを255という0x000000FFと解釈します。 0xFFFFFFFF-1になります。

バイトへのキャストは正しい解決方法です

+0

これは完全に真実ではありません。 1.0はfloatであり、Integer.MAX_VALUEより大きい数値はlongとして認識されると思います。 – aalku

+0

コメントありがとう - 私は「Any」の後に「Integer」という単語を追加しました。 MAX INTより大きい数値については、特に 'l'で指定しない限り' long'です - コンパイルされません – RonK

+0

あなたはありがとう – aalku

1

javaには符号なしの型はありません。

0xFFはint 255で、バイトオーバフローが-1にキャストされます。

私は通常、それらを符号なしにしたい場合、整数としてバイトを扱います。

int b1 = getByte() & 0xFF; 

例:255される値のためのためには、符号付きバイトであってはなりませんので

byte byte1 = 0xFF; // 255 = -1 
byte byte2 = 0xFE; // 254 = -2 
int int1 = (byte1 & 0xFF) + (byte1 & 0xFF); // 255 + 254 = 509