スポンサーサイト

-------- --:--:-- --

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【Java】byte型の自分メモ

2012-02-29 02:53:52 Wed

参考URL
http://www.creativegear.jp/2011/05/09/java_byte_to_int/
http://d.hatena.ne.jp/simply-k/20100825/1282743815
http://d.hatena.ne.jp/vividcode/20091128/1259415771


// javaのbyteは-128(2進数1111 1111)~127(2進数0111 1111)の8ビット=1バイト
System.out.println(0xC8); // 10進数で200。2進数で11001000。
byte a = (byte)0xC8; // 縮小変換。
int b = (int)a; // byteをintに入れる。拡大変換。
System.out.println(b); // 200のはずが-56になる
int c = b & 0xFF; // おまじない
System.out.println(c); // 200になる。
// この挙動は単に符号なし2進数を符号あり2進数に変換すれば起こる。
// 例えば、「1100 1000」は符号なしでは10進数200だが、符号ありでは-56。
// 絶対値を取り出して符号を反転させれば望んでいる結果が得られそうだ。
// それが二項数値昇格と「1111 1111」とのAND演算を組み合わせる「おまじない」。
// 符号なし(のつもりの)2進数「1100 1000」はbyte型にしたときに既に負数で表現されている。
// 引用「符号付き整数値の整数型 T への拡大変換は,
// 単により長い桁を埋めるために整数値の2の補数表現について符号拡張をするだけとする」より
// 2進数「1100 1000」を二項数値昇格で拡大変換すると「1111 1111 1111 1111 1111 1111 1100 1000」となる。
// これに「0000 0000 0000 0000 0000 0000 1111 1111」とAND演算することで、
// 「0000 0000 0000 0000 0000 0000 1100 1000」となり、絶対値「1100 1000」を残しつつ符号だけを変換できた。
// これによって正数となったため、 目的の200が出力される。
// なお、10進数 4294967240 という数値は符号なし2進数で「1111 1111 1111 1111 1111 1111 1100 1000」となるが、
// int型もまた「4バイト符号付整数。-2147483648~2147483647」であり、10進数 4294967240 は表現できない。

int i = 255; // 16進数 0xFF、2進数 1111 1111
byte j = (byte) i; // 整数255をbyte型に縮小変換。
System.out.println((int) j); // 拡大変換。-1になる。
// 10進数255 は 2進数で 1111 1111 となる
// int型からbyteへ縮小したところでbyteは10進数 -1(2進数1111 1111)となる



こういう考え方というのは、どの言語でも変わらないものなんだろうな。
こういう感覚を多く知りたいと思います。
スポンサーサイト

⇒comment

Secret

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます
名言集
全記事(数)表示
全タイトルを表示
ブログ内検索
Loading
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。