英語版
このページの英語版を見る
core.checkedint
このモジュールは、範囲外の結果をチェックする積分演算プリミティブを実装している。
を実装する。
積分算術演算子は固定幅の型を操作する。
これらの固定幅で表現できない結果は、収まるように静かに切り捨てられる。
に合うように切り捨てられる。
このモジュールは、同じ結果を生成する積分演算プリミティブを提供する。
このモジュールは、同じ結果を生成する積分演算プリミティブを提供するが、そのような切り捨てが発生すると「オーバーフロー」フラグを設定する。
この設定は粘着性がある。
フラグは最後にチェックすればよい。
演算が符号付きか符号なしかは、それぞれ接尾辞's'または'u'で示される。
サフィックスで示される。このような接尾辞がなくても、次のような方法で実現できる。
このような接尾辞をつけなくても、型の符号あり・なしをオーバーロードすることで実現できる。
このような接尾辞をつけなくとも、型の符号あり・符号なしをオーバーロードすることで実現できるが、接尾辞をつけることで型を調べることなく符号あり・符号なしを明確にすることができる。
これらの関数のジェネリック・バージョンは計算コストが高いが、コンパイラの実装では、演算自体のコストに比べ
しかし、コンパイラの実装は自由にそれを認識し、同等の高速なコードを生成することができる。
を認識し、同等の高速なコードを生成することができる。
ここでの関数はテンプレート化された関数であるため、-betterC、
betterCはこのライブラリとはリンクしない。
参考文献 高速な整数オーバーフローチェック
License:
Authors:
Walter Bright
- int
adds
()(intx
, inty
, ref booloverflow
);
longadds
()(longx
, longy
, ref booloverflow
); - 2つの符号付き整数を加算し、オーバーフローをチェックする。オーバーフローはスティッキーである。 つまり、オーバーフローは最後にチェックすればよい。Parameters:
int x
左オペランド int y
右オペランド bool overflow
オーバーフローが発生した場合に設定され、それ以外の場合は影響を受けない Returns:和Examples:bool overflow; assert(adds(2, 3, overflow) == 5); assert(!overflow); assert(adds(1, int.max - 1, overflow) == int.max); assert(!overflow); assert(adds(int.min + 1, -1, overflow) == int.min); assert(!overflow); assert(adds(int.max, 1, overflow) == int.min); assert(overflow); overflow = false; assert(adds(int.min, -1, overflow) == int.max); assert(overflow); assert(adds(0, 0, overflow) == 0); assert(overflow); // ねばっこい
Examples:bool overflow; assert(adds(2L, 3L, overflow) == 5); assert(!overflow); assert(adds(1L, long.max - 1, overflow) == long.max); assert(!overflow); assert(adds(long.min + 1, -1, overflow) == long.min); assert(!overflow); assert(adds(long.max, 1, overflow) == long.min); assert(overflow); overflow = false; assert(adds(long.min, -1, overflow) == long.max); assert(overflow); assert(adds(0L, 0L, overflow) == 0); assert(overflow); // ねばっこい
- uint
addu
()(uintx
, uinty
, ref booloverflow
);
ulongaddu
()(ulongx
, ulongy
, ref booloverflow
); - 2つの符号なし整数を加算し、オーバーフロー(キャリー)をチェックする。オーバーフローはスティッキーである。 オーバーフローは最後にチェックすればよい。Parameters:
uint x
左オペランド uint y
右オペランド bool overflow
オーバーフローが発生した場合に設定され、それ以外の場合は影響を受けない Returns:和Examples:for (uint i = 0; i < 10; ++i) { bool overflow; immutable uint r = addu (uint.max - i, uint.max - i, overflow); assert (r == 2 * (uint.max - i)); assert (overflow); } bool overflow; assert(addu(2, 3, overflow) == 5); assert(!overflow); assert(addu(1, uint.max - 1, overflow) == uint.max); assert(!overflow); assert(addu(uint.min, -1, overflow) == uint.max); assert(!overflow); assert(addu(uint.max, 1, overflow) == uint.min); assert(overflow); overflow = false; assert(addu(uint.min + 1, -1, overflow) == uint.min); assert(overflow); assert(addu(0, 0, overflow) == 0); assert(overflow); // ねばっこい
Examples:bool overflow; assert(addu(2L, 3L, overflow) == 5); assert(!overflow); assert(addu(1, ulong.max - 1, overflow) == ulong.max); assert(!overflow); assert(addu(ulong.min, -1L, overflow) == ulong.max); assert(!overflow); assert(addu(ulong.max, 1, overflow) == ulong.min); assert(overflow); overflow = false; assert(addu(ulong.min + 1, -1L, overflow) == ulong.min); assert(overflow); assert(addu(0L, 0L, overflow) == 0); assert(overflow); // ねばっこい
- int
subs
()(intx
, inty
, ref booloverflow
);
longsubs
()(longx
, longy
, ref booloverflow
); - 2つの符号付き整数を引き算し、オーバーフローをチェックする。オーバーフローはスティッキーである。 つまり、オーバーフローは最後にチェックすればよい。Parameters:
int x
左オペランド int y
右オペランド bool overflow
オーバーフローが発生した場合に設定され、それ以外の場合は影響を受けない Returns:差Examples:bool overflow; assert(subs(2, -3, overflow) == 5); assert(!overflow); assert(subs(1, -int.max + 1, overflow) == int.max); assert(!overflow); assert(subs(int.min + 1, 1, overflow) == int.min); assert(!overflow); assert(subs(int.max, -1, overflow) == int.min); assert(overflow); overflow = false; assert(subs(int.min, 1, overflow) == int.max); assert(overflow); assert(subs(0, 0, overflow) == 0); assert(overflow); // ねばっこい
Examples:bool overflow; assert(subs(2L, -3L, overflow) == 5); assert(!overflow); assert(subs(1L, -long.max + 1, overflow) == long.max); assert(!overflow); assert(subs(long.min + 1, 1, overflow) == long.min); assert(!overflow); assert(subs(-1L, long.min, overflow) == long.max); assert(!overflow); assert(subs(long.max, -1, overflow) == long.min); assert(overflow); overflow = false; assert(subs(long.min, 1, overflow) == long.max); assert(overflow); assert(subs(0L, 0L, overflow) == 0); assert(overflow); // ねばっこい
- uint
subu
()(uintx
, uinty
, ref booloverflow
);
ulongsubu
()(ulongx
, ulongy
, ref booloverflow
); - 2つの符号なし整数を引き算し、オーバーフロー(別名borrow)をチェックする。オーバーフローはスティッキーである。 オーバーフローは最後にチェックすればよい。Parameters:
uint x
左オペランド uint y
右オペランド bool overflow
オーバーフローが発生した場合に設定され、それ以外の場合は影響を受けない Returns:差Examples:bool overflow; assert(subu(3, 2, overflow) == 1); assert(!overflow); assert(subu(uint.max, 1, overflow) == uint.max - 1); assert(!overflow); assert(subu(1, 1, overflow) == uint.min); assert(!overflow); assert(subu(0, 1, overflow) == uint.max); assert(overflow); overflow = false; assert(subu(uint.max - 1, uint.max, overflow) == uint.max); assert(overflow); assert(subu(0, 0, overflow) == 0); assert(overflow); // ねばっこい
Examples:bool overflow; assert(subu(3UL, 2UL, overflow) == 1); assert(!overflow); assert(subu(ulong.max, 1, overflow) == ulong.max - 1); assert(!overflow); assert(subu(1UL, 1UL, overflow) == ulong.min); assert(!overflow); assert(subu(0UL, 1UL, overflow) == ulong.max); assert(overflow); overflow = false; assert(subu(ulong.max - 1, ulong.max, overflow) == ulong.max); assert(overflow); assert(subu(0UL, 0UL, overflow) == 0); assert(overflow); // ねばっこい
- int
negs
()(intx
, ref booloverflow
);
longnegs
()(longx
, ref booloverflow
); - 整数を否定する。Parameters:
int x
オペランド bool overflow
x が否定できない場合にセットされ、そうでない場合は影響を受けない。 Returns:xの否定Examples:bool overflow; assert(negs(0, overflow) == -0); assert(!overflow); assert(negs(1234, overflow) == -1234); assert(!overflow); assert(negs(-5678, overflow) == 5678); assert(!overflow); assert(negs(int.min, overflow) == -int.min); assert(overflow); assert(negs(0, overflow) == -0); assert(overflow); // ねばっこい
Examples:bool overflow; assert(negs(0L, overflow) == -0); assert(!overflow); assert(negs(1234L, overflow) == -1234); assert(!overflow); assert(negs(-5678L, overflow) == 5678); assert(!overflow); assert(negs(long.min, overflow) == -long.min); assert(overflow); assert(negs(0L, overflow) == -0); assert(overflow); // ねばっこい
- int
muls
()(intx
, inty
, ref booloverflow
);
longmuls
()(longx
, longy
, ref booloverflow
); - 2つの符号付き整数を乗算し、オーバーフローをチェックする。オーバーフローは粘着性がある。 つまり、オーバーフローは最後にチェックすればよい。Parameters:
int x
左オペランド int y
右オペランド bool overflow
オーバーフローが発生した場合に設定され、それ以外の場合は影響を受けない Returns:積Examples:bool overflow; assert(muls(2, 3, overflow) == 6); assert(!overflow); assert(muls(-200, 300, overflow) == -60_000); assert(!overflow); assert(muls(1, int.max, overflow) == int.max); assert(!overflow); assert(muls(int.min, 1, overflow) == int.min); assert(!overflow); assert(muls(int.max, 2, overflow) == (int.max * 2)); assert(overflow); overflow = false; assert(muls(int.min, -1, overflow) == int.min); assert(overflow); assert(muls(0, 0, overflow) == 0); assert(overflow); // ねばっこい
Examples:bool overflow; assert(muls(2L, 3L, overflow) == 6); assert(!overflow); assert(muls(-200L, 300L, overflow) == -60_000); assert(!overflow); assert(muls(1, long.max, overflow) == long.max); assert(!overflow); assert(muls(long.min, 1L, overflow) == long.min); assert(!overflow); assert(muls(long.max, 2L, overflow) == (long.max * 2)); assert(overflow); overflow = false; assert(muls(-1L, long.min, overflow) == long.min); assert(overflow); overflow = false; assert(muls(long.min, -1L, overflow) == long.min); assert(overflow); assert(muls(0L, 0L, overflow) == 0); assert(overflow); // ねばっこい
- uint
mulu
()(uintx
, uinty
, ref booloverflow
);
ulongmulu
()(ulongx
, uinty
, ref booloverflow
);
ulongmulu
()(ulongx
, ulongy
, ref booloverflow
); - 2つの符号なし整数を乗算し、オーバーフロー(別名キャリー)をチェックする。オーバーフローはスティッキーである。 オーバーフローは最後にチェックすればよい。Parameters:
uint x
左オペランド uint y
右オペランド bool overflow
オーバーフローが発生した場合にセットされ、そうでない場合は影響を受けない Returns:積
Copyright © 1999-2024 by the D Language Foundation
DEEPL APIにより翻訳、ところどころ修正。
このページの最新版(英語)
このページの原文(英語)
翻訳時のdmdのバージョン: 2.108.0
ドキュメントのdmdのバージョン: 2.109.1
翻訳日付 :
HTML生成日時:
編集者: dokutoku