Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

javaのプリミティブ型整数値の扱いについて

以下のように、プリミティブ型のそれぞれの型の扱える
範囲が2の乗数で規定されていますが、javaの場合マイナ
ス〜プラスの範囲で扱うため、範囲内でも範囲/2を超え
た部分をキャストして、マイナス値で保有します。
byte、short共にこれが可能なのですが、intのみキャス
トできません。なぜなのでしょうか?

byte x=(byte) 256;      //2の8乗
short y=(short) 65536;  //2の16乗
int h=4294967296;       //2の32乗

6

回答

6550

閲覧

6件の回答

評価

0

キャスト以前の問題。
256も65536もintで格納できるが、4294967296はintに格納できない。
ヒント:long

評価

0

> 範囲/2を超えた部分をキャストして、マイナス値で保有します。

単純に上位ビットが溢れてるだけだけどね。int でもちゃんとビット溢れは起こりますよ。

int i = Integer.MAX_VALUE + 1;

とやって i の値を見てみてください。 -2147483648 (MIN_VALUE)になります。


> int h = 4294967296; //2の32乗

これがコンパイルエラーになるのは別の話。[0-9]+ で記述した数値リテラルは int と見なされるんだけど、int であらわせる最大値は、2147483647 だから、これを超える数値リテラルは int として表記することはできない。

じゃあ、どうすればいいかというと数値リテラルが long であることを明示してあげればいい。末尾に L を付けると数値リテラルが long ということになる。(このくらいのことコンパイラが自動的に判断してくれてもいいのにね。)

だから 4294967296 という数値リテラルは Java では 4294967296L と書かなければならない。

そして、long 型の数値リテラルを int 型変数に格納するのであれば、明示的なキャストも必要になります。つまり

int h = (int)4294967296L;

と書くことになるわけ。そして、この結果は byte や short と同様になりますよ。

評価

0

キャストするためには、対象となるint型変数が必要ってこと。

2^32の場合は、そもそも最初のint型変数が用意できないから、コンパイルも通らないんだな。

評価

0

色々ありがとうございます。
しかし、byteは、macアドレスやIPアドレスなど、256範囲で
扱いたい物を入れますし、utf-16だとshortがちょうど16の4
乗なのですが、intの数分のデータを扱いたい時に、キャス
トできないと不便でした。
しかも、後で気が付いたのですが、キャストしてちょうど2
のべき乗できるってことは、0ないんですかねぇ。

評価

0

せっかくヒント書いておいたのに。
コンパイラにintじゃないと知らせてやればいいんだよ。

評価

0

え?
2010-11-09 18:17 って、読んで理解できるものなの?

すごい。
うらやましいとは思わないけど。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。