Skip to content

How to Resolve Error "CS1021: Integral constant is too large" in C#

Fix C# compiler error CS1021 when numeric literals exceed the maximum value of ulong (18,446,744,073,709,551,615) by using BigInteger, scientific notation, or proper type suffixes.

The Compiler Error CS1021 is a numeric range error. The message reads: "Integral constant is too large".

In C#, the compiler automatically assigns a data type to numeric literals (like 100 or 0xFF) based on their size. It tries to fit the number into int, uint, long, and finally ulong (Unsigned 64-bit integer). The maximum value a ulong can hold is 18,446,744,073,709,551,615.

If you type a number literal larger than this maximum limit, the compiler has no built-in primitive type to store it, resulting in CS1021.

This guide explains how to work with numbers that exceed the limits of standard C# primitive types.

Understanding the Limit

C# primitives have fixed sizes:

  • long (Int64): ~9.22 Quintillion (Max)
  • ulong (UInt64): ~18.44 Quintillion (Max)

The compiler parses integer literals by trying to fit them into the smallest container possible. If a literal exceeds the 64-bit capacity of ulong, the compiler stops because it cannot represent that constant in binary form natively.

Scenario 1: Exceeding ulong.MaxValue

This is the most common cause. You need to represent a massive number (perhaps for cryptography, astronomy, or an ID system), and you try to assign it to a long or var.

Example of error

public class BigMath
{
    public void Calculate()
    {
        // ⛔️ Error CS1021: Integral constant is too large.
        // This number is larger than 18,446,744,073,709,551,615.
        // Even 'var' cannot hold it because there is no primitive type big enough.
        var massiveNumber = 9999999999999999999999999; 
    }
}

Solution: Use System.Numerics.BigInteger

If you need precise integer arithmetic for numbers of arbitrary size, use the BigInteger struct. Since there is no literal syntax for BigInteger (like 123bi) in standard C#, you must parse the number from a string.

using System.Numerics; // Requires System.Runtime.Numerics assembly

public class BigMath
{
    public void Calculate()
    {
        // ✅ Correct: Parse the string representation.
        // BigInteger can hold theoretically unlimited values (bound by RAM).
        BigInteger massiveNumber = BigInteger.Parse("9999999999999999999999999");
        
        System.Console.WriteLine(massiveNumber);
    }
}

Scenario 2: Using Floating Point for Large Numbers

If the number represents a scientific value where precision isn't the primary concern (e.g., distance to a star), you should use double.

Example of error

Writing a massive integer literal for a value intended to be a double.

public void Science()
{
    // ⛔️ Error CS1021: The compiler treats this as an integer first.
    double molecules = 602200000000000000000000; 
}

Solution: Use Scientific Notation or Suffixes

Tell the compiler to treat the literal as a double immediately by adding a decimal point, scientific notation (e), or the d suffix.

public void Science()
{
    // ✅ Correct: Scientific notation (Avogadro's constant example)
    double molecules = 6.022e23;

    // ✅ Correct: 'd' suffix forces it to be treated as a double, 
    // which has a much larger range than ulong (up to ~1.7e308).
    double largeValue = 9999999999999999999999999d;
}

Scenario 3: Hexadecimal Overflow

This often happens when copying keys, hashes, or bitmasks from other languages or documentation.

Example of error

Attempting to assign a hex value larger than 16 hex digits (64 bits).

public class Crypto
{
    // ⛔️ Error CS1021: 0x followed by too many digits.
    // 16 'F's is the max for ulong. This has 20.
    ulong key = 0xFFFFFFFFFFFFFFFFFFFF; 
}

Solution: Use Byte Arrays or Strings

Data this large is usually meant to be a byte array or a BigInteger.

using System.Numerics;

public class Crypto
{
    public void LoadKey()
    {
        // ✅ Option A: Parse from Hex String to BigInteger
        // Prepend '0' to ensure it's treated as positive if using Parse
        BigInteger key = BigInteger.Parse("0FFFFFFFFFFFFFFFFFFFF", System.Globalization.NumberStyles.HexNumber);

        // ✅ Option B: Store as a string if no math is needed
        string keyString = "FFFFFFFFFFFFFFFFFFFF";
    }
}

Conclusion

CS1021 is the compiler saying: "This number is too big for a CPU register."

  1. Check the Magnitude: Is it larger than 18,446,744,073,709,551,615?
  2. Precision Math: If you need exact integers (e.g., financial, crypto), use BigInteger.Parse("string").
  3. Approximate Math: If you are doing science/physics, use double with scientific notation (e.g., 1.5e25).
Navigation