うっかりオーバーフロー

文字コードまわりのJavaの検証コードを書いていると、byte型を多く使う。明示的にbyte型へのキャストも行う。
「うっかり、整数算術、関係演算子による大小比較を行わないようにせねば」と思った。

    int  ff   =        0xff;    // ff   は、255
    byte oops = (byte) 0xff;    // oops は、-1

0xffは、整数リテラル。byte型は、8ビット符号付き整数で、2の補数表現。プリミティブ型はシンプルなの。
と言い聞かせる。

2010/05/23追記

図の内容が誤っていた(10進数の2を、2進数で11としていた)ので、図をさしかえた。
ちなみに、byte型の変数名をoopsとしているが、この行自体が誤っているわけではない。ただ「大小比較とかすると-1だから、間違えないように」ということ。