How to handle arbitrarily large integers

后端 未结 7 886
南旧
南旧 2020-12-01 11:34

I\'m working on a programming language, and today I got the point where I could compile the factorial function(recursive), however due to the maximum size of an integer the

7条回答
  •  抹茶落季
    2020-12-01 12:00

    If you're building this into a language (for learning purposes I'd guess), I think I would probably write a little BCD library. Just store your BCD numbers inside byte arrays.

    In fact, with today's gigantic storage abilities, you might just use a byte array where each byte just holds a digit (0-9). You then write your own routine to add, subtract multiply and divide your byte arrays.

    (Divide is the hard one, but I bet you can find some code out there somewhere.)

    I can give you some Java-like psuedocode but can't really do C++ from scratch at this point:

    class BigAssNumber {
        private byte[] value;
    
        // This constructor can handle numbers where overflows have occurred.
        public BigAssNumber(byte[] value) {
            this.value=normalize(value);
        }
    
        // Adds two numbers and returns the sum.  Originals not changed.
        public BigAssNumber add(BigAssNumber other) {
            // This needs to be a byte by byte copy in newly allocated space, not pointer copy!
            byte[] dest = value.length > other.length ? value : other.value;         
    
            // Just add each pair of numbers, like in a pencil and paper addition problem.
            for(int i=0; i 9) {
                    value[i] -=10;
                    value[i+1] +=1;
                }
            }
        }
    }
    

    I use the fact that we have a lot of extra room in a byte to help deal with addition overflows in a generic way. Can work for subtraction too, and help on some multiplies.

提交回复
热议问题