public MinAndMax(IntegerBitWidth bitWidth, bool isSigned) { Mask = BigInteger.Pow(2, (int)bitWidth) - 1; if (isSigned) { var num = BigInteger.Pow(2, (int)bitWidth - 1); Min = -num; Max = num - 1; } else { Min = 0; Max = Mask; } }
public static LimitedIntegerToken Parse(string value, IntegerBase numBase, IntegerBitWidth bitWidth, bool isSigned, bool isNeg, string rawToken, SourcePosition position, IConfiguration configuration) { BigInteger val; switch (numBase) { case IntegerBase.Binary: val = value.Replace("b", "").Replace("B", "").BigIntegerFromBinary(); break; case IntegerBase.Octal: val = value.Replace("o", "").Replace("O", "").BigIntegerFromOctal(); break; case IntegerBase.Decimal: val = BigInteger.Parse(value, NumberStyles.Integer); break; case IntegerBase.Hexadecimal: val = BigInteger.Parse(value.Replace("0x", "00").Replace("0X", "00"), NumberStyles.HexNumber); break; default: throw new ParseException($"Unhandled integer base {numBase}."); } return(new LimitedIntegerToken(val, bitWidth, isSigned, isNeg, $"{(isNeg ? "-" : "")}{rawToken}", position, configuration)); }
private LimitedIntegerToken(BigInteger typedValue, IntegerBitWidth bitWidth, bool isSigned, bool isNeg, string rawToken, SourcePosition position, IConfiguration configuration) : base(LiteralTokenType.LimitedInteger, (isNeg ? typedValue * -1 : typedValue), rawToken, position) { if (isNeg) { typedValue *= -1; } SignAndBitWidth = new BitWidthAndSignPair(bitWidth, isSigned); _minAndMax = MinAndMaxMap.Instance[SignAndBitWidth]; if (!(configuration?.IgnoreLimitedIntegerMaxMinRange ?? false)) { if (typedValue < _minAndMax.Min) { throw new ParseException($"{typedValue} is less than the minimum of {_minAndMax.Min} for a {bitWidth.GetEnumDescription()}-bit {(isSigned ? "signed" : "unsigned")} {nameof(LimitedIntegerToken)} "); } else if (typedValue > _minAndMax.Max) { throw new ParseException($"{typedValue} is greater than the maximum of {_minAndMax.Max} for a {bitWidth.GetEnumDescription()}-bit {(isSigned ? "signed" : "unsigned")} {nameof(LimitedIntegerToken)} "); } } }
public BitWidthAndSignPair(IntegerBitWidth bitWidth, bool isSigned = true) { BitWidth = bitWidth; IsSigned = isSigned; }