[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends:00082] Re: String を byte 配列で書き出す方法について



中島です。こんにちは。

> 保坂ともうします。
> 
> Javaは全く使っておりませんが、
> 私の直感からずれていると感じたので調べてみました。
> 
> 直感 : 何のためにbyte型が存在するか?

わからないけどASCIIキャラクターだけは保存できるように
なってるんじゃないかな。

> 
> なにを調べたかというと、
> 
> Java言語仕様書 第二版 ピアソン・エデュケーション
> p59 
> 5.1.3 プリミティブ型のナローイング変換
> 
> #intからbyteへの変換はこれに該当します。
> 
> で、なんと書いてあるかというと、
> 
> 符合付き整数から整数型Tへのナローイング変換では、型Tを表現するために
> 使用されるビット数をnとした場合、下位nビットを除いた全てのビットが
> 破棄される。また数値の絶対量に関する情報が欠落する可能性に加えて、
> 結果となる値の符合が入力値の符合と異なる可能性も発生する。
> 
> さらに、p61にはサンプルコードがあり、
> 要点だけ引用すると、
> 
> System.out.println("(int)255==" + (byte)255);
> 
> を実行すると、出力として
> 
> (byte)255==-1
> 
> を得る。

これがなんでオーバーフローしない根拠になるのかわかりません。

http://java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html#48440

4.2.1 Integral Types and Values
The values of the integral types are integers in the following ranges:
* For byte, from -128 to 127, inclusive

とあるように、-128から127しか保持できないbyte型に0x87つまり135を
代入したらオーバーフローしますよね。byte型は符号に1ビット使って
いるからASCIIキャラクタ以外の文字を代入したらオーバーフローする
可能性は大いにありますよ。

試しに
System.out.println("int:"+Integer.parseInt("87",16));
byte b = (byte)Integer.parseInt("87",16);
System.out.println("byte:"+b);
とやってみていただきたい。

> 
>>オーバーフローの結果、DBの値が改ざんされてファイルに出力
>>されていると思いますよ。本当にこういうコードを書いていたら。
> 
> そんなことはないというのが結論です。

いやいや、そんなことはないというのが結論です(笑)