long型の数値には末尾にl,Lを付与しなければいけません。
なぜなら、数値データのデフォルト型がintであるため。
と認識しています。
しかし、byte,short型のデータを宣言する場合は末尾にb,sを付けなくてもエラーにはなりません。(int型のデータをbyte,short型の変数に代入しようとしているのに)
Java
1short s = 1; 2byte b = 1; 3//コンパイルOK
なぜでしょうか。
よろしくお願いいたします。
追記 2021/06/05
回答をいただいての追記です。
まず、私の質問内容で不正確な箇所があったため以下のとおり修正します。
- 修正前
long型の数値には末尾にl,Lを付与しなければいけません。
↓
- 修正後
intサイズを超えるlongの値を扱う場合はl,Lを付与しなければいけません。
irithyllさん
kainaさん
neko_the_shadowさん
ご回答ありがとうございました。
私の質問の仕方が悪く意図が伝わってなかったこと反省しています。。。
Java学習サイトや本などで、
数値リテラルのデフォルト型はintであるためlong型に代入する場合はl,Lを付与しましょう。
との記載が多くみられました。
デフォルト型がintであればbyte,short型にそのまま代入できないことになる。
したがって、矛盾してないか、私の認識不足かまたは別の仕様があるのかと思ったのが今回の質問の背景です。
neko_the_shadowさんの回答が意図に沿ったものだったのでベストアンサーとさせていただきます(他のお2人、申し訳ございません)
以下、ざっくりとまとめておきます。
自動で基本型縮小変換が行われる条件がある。
- 代入先の型がbyte,short,charである。
- 右辺の値が代入先の型で表現できる。
- 右辺は必ず定数式
Java
1short s = 5; 2//コンパイルOK
Java
1short s = 5; 2byte b = s; 3//コンパイルNG
ちなみに浮動種数点型では自動基本型縮小変換は行われないので注意すること。
視点を変えて、lはあるのにs,bがないのはなぜかはirithyllさん、kainaさんに回答していただいた通り。(仕様の背景がよく理解できました!)
回答していただいた方々、本当にありがとうございました!
回答3件
あなたの回答
tips
プレビュー