うちのblogの検索ワードみてると、Javaで符号なし整数を使いたいんだろうなー的雰囲気を感じます。まあとりあえず大失敗した経験からいって、32bit符号なし整数をintで表現するのはやめたほうがいいですよ。
基本はひとつ大きい型で、符号はキャストとビット演算でがんばる。32bit符号なし整数に関しては、たぶん最新バージョンでも変わっていないであろう不可解な挙動があるので、数字の末尾にLをつけよう。
小さい型から大きい型に変換するときは符号拡張が起こるので、符号なし整数の最大値(オールF)とAND演算することで、余計な符号拡張分を消し去ります。
しっかし、うちみたいな場末のblogにたどり着く程度には需要があるのだから、YOU実装しちゃいなよと思う。.NET Frameworkにもあるんだし。
Javaにおいて
long hoge = 0xFFFFFFFF;
は-1になる。int型に0xFFFFFFFFを代入しようとするとNumberFormatException(定数の場合はそもそもコンパイルできない)がスローされるから、0xFFFFFFFFと書けばlong型と認識すると思ってた。しかしコンパイラは、接尾辞のない数値はとりあえずintにしちゃれ、ということになっているらしい。右辺をintと認識→左辺に合わせて符号拡張→代入、という流れと思うが、数値がすべからく符号つきであるJavaにおいて、このときだけ符号のついていない数値を負の数とする挙動は納得しがたい。
デバッグ中、正常データを入力してるのにエラーばっかり吐きやがるので何事かと思ったら、暗黙の型変換の罠にどっぷりはまっていた罠。-1とアドレスを比較したら、アドレスのほうが常に大きいに決まってるよね(´・ω・`)
正の数たる0xFFFFFFFFを代入しようと思ったら、0xFFFFFFFFLと書かなければダメらしい・・・