私は番号を持っています:94,800,620,800
Floatは4バイトのデータ型です。Int32も4バイトのデータ型です。
float f = 94800620800; // ok
Int32 t = 94800620800; // error
この問題を説明してください。Int32を使用するとエラーが発生するのはなぜですか。どちらも4バイトのデータ型であるため、この数値をfloatデータ型に使用できるのはなぜですか。ありがとう。
私は番号を持っています:94,800,620,800
Floatは4バイトのデータ型です。Int32も4バイトのデータ型です。
float f = 94800620800; // ok
Int32 t = 94800620800; // error
この問題を説明してください。Int32を使用するとエラーが発生するのはなぜですか。どちらも4バイトのデータ型であるため、この数値をfloatデータ型に使用できるのはなぜですか。ありがとう。
割り当てようとしている数値は、タイプの数値で可能な最大値Int32
( 2,147,483,647)よりも大きいためです。注意すべき点として、aの最大値Single
は3.402823×1038です。
Int32の最大値は2,147,483,647で、94,800,620,800未満です。
フロートは、次の範囲の値を取ることができます:±1.5×10-45〜±3.4×1038
また、このSOの質問を確認してください-Javaでサイズが同じ場合のfloatデータ型と整数データ型の違いは何ですか?。これはJavaの質問ですが、概念は同じであり、同じサイズであっても違いの詳細な説明があります。
その数は4バイト整数には大きすぎるためです。のようなスカラー値にInt32
は最小制限と最大制限(この場合はそれぞれ-231と231-1)があり、この範囲外の値を格納することはできません。
浮動小数点数はまったく異なる方法で格納されるため、大きな値でコンパイラエラーが発生することはなく、後で実行時に精度の問題が発生する可能性があります。
これらのタイプのため、内部表現。
float
i、d ^ nのようなものを使用します。ここで、iは整数部分、dは小数部分、nは指数です(もちろん、これは基数2で発生します)。
このようにして、より大きな数をに格納できますが、たとえば、整数を格納するfloat
場合のように正確ではありません。Int32
変換しようとすると
float f = 94800620800;
その値を格納するのに十分な大きさの積分型の場合、最初の94800620800と同じではない可能性があります。
たぶんあなたはエラーメッセージを読むべきですか?;)
Error Integral constant is too large
32ビット整数の最大値は2,147,483,647です。
一方、フロートは、単一の数値ではなく仮数と指数を格納するため機能するため、精度を失う可能性を犠牲にして、はるかに広い範囲に対処できます。
フロートを印刷してみてください。下のビットが失われるので、94800620000
代わりに取得します。94800620800
整数型は正確な表現ですが、浮動小数点数は有効数字と指数の組み合わせです。
浮動小数点wikiページは、これがどのように機能するかを説明しています。
Int32の最大値は2,147,483,647です。あなたの価値ははるかに高いです。
system.int32.maxvalueを見てください
提供された定数式の値がintデータ型の範囲内にありません。
Int32の範囲は-2,147,483,648から2,147,483,647になります。変数が範囲外です。