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

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



保坂ともうします。

Javaは全く使っておりませんが、
私の直感からずれていると感じたので調べてみました。

直感 : 何のためにbyte型が存在するか?

#Cと違ってJavaはchar == unicodeなので

> > strB = "A7"
> > byte bytA = (byte)Integer.parseInt(strA , 16);
> 完成の喜びに水を差すようですが、そもそも、0x87や0xA7は
> byte型に入りますかね?127から-128までじゃないですか。
> これじゃオーバーフローしてますよね。
なにを調べたかというと、

Java言語仕様書 第二版 ピアソン・エデュケーション
p59 
5.1.3 プリミティブ型のナローイング変換

#intからbyteへの変換はこれに該当します。

で、なんと書いてあるかというと、

符合付き整数から整数型Tへのナローイング変換では、型Tを表現するために
使用されるビット数をnとした場合、下位nビットを除いた全てのビットが
破棄される。また数値の絶対量に関する情報が欠落する可能性に加えて、
結果となる値の符合が入力値の符合と異なる可能性も発生する。

さらに、p61にはサンプルコードがあり、
要点だけ引用すると、

System.out.println("(int)255==" + (byte)255);

を実行すると、出力として

(byte)255==-1

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