code: private FDBigInteger add(FDBigInteger other) {
          FDBigInteger big, small;
          int bigLen, smallLen;
          int tSize = this.size();
          int oSize = other.size();
          if (tSize >= oSize) {
              big = this;
              bigLen = tSize;
              small = other;
              smallLen = oSize;
          } else {
              big = other;
              bigLen = oSize;
              small = this;
              smallLen = tSize;
          }
          int[] r = new int[bigLen + 1];
          int i = 0;
          long carry = 0L;
          for (; i < smallLen; i++) {
              carry += (i < big.offset   ? 0L : (big.data[i - big.offset] & LONG_MASK) )
                     + ((i < small.offset ? 0L : (small.data[i - small.offset] & LONG_MASK)));
              r[i] = (int) carry;
              carry >>= 32; // signed shift.
          }
          for (; i < bigLen; i++) {
              carry += (i < big.offset ? 0L : (big.data[i - big.offset] & LONG_MASK) );
              r[i] = (int) carry;
              carry >>= 32; // signed shift.
          }
          r[bigLen] = (int) carry;
          return new FDBigInteger(r, 0);
      }
docs: /*@
  @ assignable \nothing;
  @ ensures \result.value() == \old(this.value() + other.value());
  @