数値のあふれと変換
対応(10)
Section titled “対応(10)”| 書き方 | 説明 | 注意 |
|---|---|---|
int.MaxValue + 1 | int のあふれ | 例外は出ません。 |
long.MaxValue + 1 | long のあふれ | |
(uint)0 - 1 | 符号なしのあふれ | |
unchecked { n = n + 1; } | unchecked で囲む | もともと検査していないためです。 |
(byte)300 | 型を縮める変換 | |
(int)2.7f | 小数から整数への変換 | |
byte + byte | 小さい型どうしの計算 | |
-7 / 2 | 整数の割り算 | |
1f / 0f | 小数を 0 で割る | |
0.1 + 0.2 | 小数の誤差 | C# と同じ結果になります。 |
非対応(1)
Section titled “非対応(1)”| 書き方 | 説明 | エラー | 理由 | 代替 |
|---|---|---|---|---|
checked { n = n + 1; } | あふれたときに止める | TUKI0001 | 設計 | 計算の前に範囲へ収まるかを if で確認する。unchecked は書けます |
| 分かる時点 | あふれるかどうかは実行時の値で決まるので、コンパイル時には分かりません |
unchecked | 書けます。もともと検査していないので、囲んでも値は変わりません |
int のあふれ
Section titled “int のあふれ”上限を超えると下限へ、下限を下回ると上限へ回ります。
using UnityEngine;using Tsukimi;
public class NumericsIntOverflow : TsukimiBehaviour{ void Start() { int max = int.MaxValue; max = max + 1; Debug.Log(max); // => -2147483648
int min = int.MinValue; min = min - 1; Debug.Log(min); // => 2147483647 }}long のあふれ
Section titled “long のあふれ”using UnityEngine;using Tsukimi;
public class NumericsLongOverflow : TsukimiBehaviour{ void Start() { long n = long.MaxValue; n = n + 1; Debug.Log(n); // => -9223372036854775808 }}符号なしのあふれ
Section titled “符号なしのあふれ”using UnityEngine;using Tsukimi;
public class NumericsUnsignedWrap : TsukimiBehaviour{ void Start() { uint n = 0; n = n - 1; Debug.Log(n); // => 4294967295 }}unchecked で囲む
Section titled “unchecked で囲む”unchecked で囲んでも、囲まないときと同じ値になります。
using UnityEngine;using Tsukimi;
public class NumericsUncheckedOverflow : TsukimiBehaviour{ void Start() { int n = int.MaxValue; unchecked { n = n + 1; } Debug.Log(n); // => -2147483648 }}型を縮める変換
Section titled “型を縮める変換”using UnityEngine;using Tsukimi;
public class NumericsNarrowingCast : TsukimiBehaviour{ void Start() { int over = 300; Debug.Log((byte)over); // => 44
int negative = -1; Debug.Log((byte)negative); // => 255 }}小数から整数への変換
Section titled “小数から整数への変換”using UnityEngine;using Tsukimi;
public class NumericsFloatTruncation : TsukimiBehaviour{ void Start() { float positive = 2.7f; Debug.Log((int)positive); // => 2
float negative = -2.7f; Debug.Log((int)negative); // => -2 }}小さい型どうしの計算
Section titled “小さい型どうしの計算”using UnityEngine;using Tsukimi;
public class NumericsSmallTypeArithmetic : TsukimiBehaviour{ void Start() { byte a = 200; byte b = 200; int sum = a + b; Debug.Log(sum); // => 400
short s = 30000; short t = 30000; int total = s + t; Debug.Log(total); // => 60000 }}整数の割り算
Section titled “整数の割り算”using UnityEngine;using Tsukimi;
public class NumericsIntegerDivision : TsukimiBehaviour{ void Start() { int n = -7; Debug.Log(n / 2); // => -3 Debug.Log(n % 2); // => -1 }}小数を 0 で割る
Section titled “小数を 0 で割る”整数を 0 で割ると実行が停止しますが、小数では Infinity になります。
using UnityEngine;using Tsukimi;
public class NumericsFloatDivideByZero : TsukimiBehaviour{ void Start() { float one = 1f; float zero = 0f; Debug.Log(one / zero); // => Infinity }}2 進の小数で表せない値があるので、10 進で書いたとおりの値にはなりません。
using UnityEngine;using Tsukimi;
public class NumericsDoublePrecision : TsukimiBehaviour{ void Start() { double sum = 0.1 + 0.2; Debug.Log(sum); // => 0.30000000000000004 }}