+template < typename N, typename E >
+number< N, E >& number< N, E >::operator-= (const number< N, E >& n)
+{
+ // minuendo - substraendo
+ number< N, E > minuend;
+ number< N, E > subtrahend;
+
+ // voy a hacer siempre el mayor menos el menor
+ if (*this < n)
+ {
+ minuend = n;
+ subtrahend = *this;
+ //minuendo < sustraendo => resultado negativo
+ minuend.sign = negative;
+ }
+ else
+ {
+ minuend = *this;
+ subtrahend = n;
+ //minuendo > sustraendo => resultado positivo
+ minuend.sign = positive;
+ }
+
+ size_type ini = 0;
+ size_type fin = std::min(minuend.chunk.size(), subtrahend.chunk.size());
+ size_type i; //problema de VC++, da error de redefinición
+
+ //estoy seguro de que minuend > subtrahend, con lo cual itero hasta el size del
+ //menor de los dos. Si el otro es más grande, puede ser que esté lleno de 0's pero
+ //no puede ser realmente mayor como cifra
+ for (i = ini; i < fin; ++i)
+ {
+ // si no alcanza para restar pido prestado
+ if ((minuend.chunk[i] < subtrahend.chunk[i]))
+ {
+ // no puedo pedir si soy el más significativo ...
+ assert (i != fin);
+
+ // le pido uno al que me sigue
+ minuend.borrow(i+1);
+ }
+
+ // es como hacer 24-5: el 4 pide prestado al 2 (borrow(i+1)) y después
+ // se hace 4 + (9-5) + 1
+
+ minuend.chunk[i] += (~((N)0) - subtrahend.chunk[i]) + 1;
+ }
+
+ //retorno el minuendo ya restado
+ *this = minuend;
+ return *this;
+}
+
+template < typename N, typename E >
+number< N, E > operator- (const number< N, E >& n1, const number< N, E >& n2)
+{
+ number< N, E > tmp = n1;
+ tmp -= n2;
+ return tmp;
+}
+
+
+template < typename N, typename E >
+bool number< N, E >::operator< (const number< N, E >& n) const
+{
+ if (sign != n.sign)
+ {
+ if (sign == positive) // yo positivo, n negativo
+ return false; // yo soy más grande
+ else // yo negagivo, n positivo
+ return true; // n es más grande
+ }
+
+ size_type i; //problema de VC++, da error de redefinición
+
+ if (chunk.size() > n.chunk.size()) // yo tengo más elementos
+ {
+ // Recorro los bytes más significativos (que tengo sólo yo)
+ for (i = n.chunk.size(); i < chunk.size(); ++i)
+ {
+ if (chunk[i] != 0) // Si tengo algo distinto a 0
+ {
+ return false; // Entonces soy más grande
+ }
+ }
+ }
+ else if (chunk.size() < n.chunk.size()) // n tiene más elementos
+ {
+ // Recorro los bytes más significativos (que tiene sólo n)
+ for (i = chunk.size(); i < n.chunk.size(); ++i)
+ {
+ if (chunk[i] != 0) // Si n tiene algo distinto a 0
+ {
+ return true; // Entonces soy más chico
+ }
+ }
+ }
+ // sigo con la intersección de ambos
+ size_type fin = std::min(chunk.size(), n.chunk.size());
+ i = fin;
+ while (i != 0) {
+ --i;
+
+ if (chunk[i] < n.chunk[i]) // Si es menor
+ {
+ return true;
+ }
+ else if (chunk[i] > n.chunk[i]) // Si es mayor
+ {
+ return false;
+ }
+ // Si es igual tengo que seguir viendo
+ }
+
+ return false; // Son iguales
+}
+