longのビット数で加減算の飽和演算を行いたいです。
検索してもSIMD関連の話題ばかり引っかかってしまいます。

int幅であればlongにキャストして演算後、intに戻すという手段を使えますが、longの場合BigIntegerを使用するというのは大げさな気がします。
効率のよいアルゴリズムがあれば教えて頂きたいです。

// SaturationLong
public struct SatLong
{
    public long Value;
    public SatLong(long value)
    {
        Value = value;
    }
    public static SatLong operator +(SatLong value1, SatLong value2)
    {
        // todo: saturation
        return new SatLong(value1.Value + value2.Value);
    }

    public static SatLong operator -(SatLong value1, SatLong value2)
    {
        // todo: saturation
        return new SatLong(value1.Value - value2.Value);
    }
}