¿Cuál es el propósito de una sustracción binario sin signo?

Simple: Al igual que cualquier otra sustracción, para encontrar la distancia entre los dos números.

Con el fin de garantizar un resultado positivo, es necesario asegurarse de que resta el valor más pequeño del valor más grande. Por lo tanto, siempre se puede encontrar la diferencia absoluta entre dos números sin signo con algo como esto:

si (a <b) {
diff = b – a;
} más {
diff = a – b;
}

De hecho, muchos codificadores de vídeo utilizan este tipo de aritmética al comparar bloques de píxeles de las diferencias, ya que los valores de píxeles están normalmente sin firmar.

Sin embargo, la diferencia absoluta no siempre es lo que estás buscando.

aritmética sin signo, al menos en C y C ++, es de módulo aritmética con respecto al tamaño del entero. Eso significa que todas las sumas y restas se ajustan como si se realizaran en módulo [matemático] 2 ^ N [/ matemático], donde [matemático] N [/ matemático] es el número de bits. Esto tiene muchas propiedades agradables.

Por ejemplo, suponga que desea determinar qué tan separados en el tiempo ocurrieron dos eventos en un sistema de larga ejecución. Usted sabe, basado en alguna otra propiedad del sistema, que los dos eventos siempre estarán dentro, digamos, [matemática] 2 ^ 20 [/ matemática] milisegundos entre sí. Pero, el sistema de larga duración podría estar funcionando durante semanas, meses o años. Ahora supongamos que mantiene un contador de “milisegundos” que incrementos cada vez milisegundo, y ese contador se mantiene en un 32-bit entero sin signo.

Resulta que, gracias a la propiedad de módulo, que da dos eventos, a veces [matemáticas] t_1 [/ matemáticas] y [matemáticas] t_2 [/ matemáticas], la diferencia [matemáticas] t_2 – t_1 [/ matemáticas] siempre será el correcta número de milisegundos, incluso si está cerca de un límite en el que el temporizador de milisegundo ‘envuelve’.

Supongamos, por ejemplo, [matemáticas] t_1 = \ texttt {0xfffffff0} [/ math], mientras que [matemáticas] t_2 = \ texttt {0x00000015} [/ math]. Cuando calcules [math] t_2 – t_1 = \ texttt {0x00000015} – \ texttt {0xFFFFFFF0} [/ math] obtendrás [math] \ texttt {0x00000025} [/ math], debido al comportamiento de ajuste de módulo de unsigned aritmética binaria Adición de la diferencia a los espectáculos de valor de partida que esto es de hecho la distancia entre los dos eventos: [matemáticas] \ texttt {0xfffffff0} + \ texttt {0x00000025} = \ texttt {0x00000015} [/ math].

Esta propiedad realmente subyace a una buena cantidad de protocolos que dependen de marcas de tiempo, lo creas o no.