4

ラッパーByte.parseByte()parseXXX().

からparseByte(String s, int radix)'s JavaDoc:

文字列引数を、2 番目の引数で指定された基数の符号付きバイトとして解析します。

しかし、それは完全に真実ではありませんradix = 2。つまり、 のバイナリ リテラル-127は次の10000000とおりです。

byte b = (byte) 0b10000000;

したがって、次のことが当てはまる必要があります。

byte b = Byte.parseByte("10000000", 2);

残念ながら、それは をスローNumberFormatExceptionし、代わりに次のようにする必要があります。

byte b = Byte.parseByte("-111111", 2);

whereparseByte()は、バイナリ文字列を符号付きバイナリ (符号と大きさ) として解析します。ここで、符号付きバイナリ (2 の補数、つまり MSB が符号ビット) として解析する必要があります。

私はこれについて間違っていますか?

4

2 に答える 2

4

私はこれについて間違っていますか?

はい。Javadoc は、2 の補数について何も述べていません。実際、それは負の値をどのように認識するかを明示的に述べています (つまり、-接頭辞なので、事実上「人間が読める」符号の大きさ)。

別の方法で考えてみてください。基数 2 を 2 の補数として解釈した場合parseByte、基数 10 (または実際には他の基数) に対して何をしたいですか? 一貫性を保つためには、10 の補数にする必要がありますが、これは不便です。

于 2013-02-18T13:54:28.853 に答える
1

これは、parseByte の "10000000" が正の値 (128) であり、バイト値の範囲 -128 から 128 に収まらないためです。しかし、BigInteger を使用して 2 の補数のバイナリ文字列表現を解析できます。

byte b = new BigInteger("10000000", 2).byteValue()

これにより、予想される -128 の結果が得られます

于 2013-08-29T10:49:48.017 に答える