Conversión de enteros sin signo de mayor a menor en C

Fui a través de k & r. Tenía problemas para entender las siguientes líneas en la página 197 (sección A6)

Conversiones integrales: cualquier entero se convierte a un tipo sin signo dado al encontrar el valor no negativo más pequeño que sea congruente con ese entero, módulo uno más que el valor más grande que se puede representar en el tipo sin signo.

¿Puede alguien explicar esto en detalle? Gracias

cualquier número entero se convierte a un tipo sin signo dado al encontrar el valor no negativo más pequeño que sea congruente con ese número entero, módulo uno más que el valor más grande que se puede representar en el tipo sin signo.

Tomemos esto poco a poco y de atrás hacia atrás:

¿Cuál es el valor más grande que se puede representar en el tipo sin signo de ancho n bits?

2^(n) - 1. 

¿Qué es uno más que este valor?

 2^n. 

¿Cómo se lleva a cabo la conversión?

 unsigned_val = signed_val % 2^n 

Ahora, la parte de por qué: el estándar no establece qué representación de bits se utiliza. De ahí la jerga. En una representación de complemento a dos, que es por mucho la más utilizada, esta conversión no cambia el patrón de bits (a menos que haya un truncamiento, por supuesto).

Consulte Conversiones integrales de la norma para obtener más detalles.

Significa que solo se contarán los bits de valor bajo y los bits de orden superior se descartarán.

Por ejemplo:

 01111111 11111111 11110000 00001111 

Cuando se convierta a un unsigned short 16 bits unsigned short será:

 11110000 00001111 

Esto se expresa matemáticamente de manera efectiva en:

 target_value = value % (target_type_max+1) ( % = modulus operator )