La forma en que funciona la asignación de enteros a un tipo entero sin signo en el lenguaje C es bastante sencilla y sencilla, y mejor aún, es predecible.
Si asigna un número entero M a una variable de un tipo entero sin signo, y si el valor de M no puede representarse en ese tipo entero, entonces elegirá el valor único N que puede representarse en el tipo entero sin signo de destino, de modo que La diferencia entre N y M es un múltiplo exacto del número de valores que puede contener el tipo de objetivo.
En este caso, el tipo de destino (carácter sin signo) puede contener 256 valores. Entonces, cuando asigna cualquier número entero fuera de [0 … 255] en un carácter sin signo, elige el valor único dentro de ese rango de manera que la diferencia entre su número M y el número asignado N sea divisible por 256.
En este caso, M es -1, y el único número N en el rango [0 … 255] tal que NM es un múltiplo exacto de 256 es el número N = 255. Cuando N = 255, la diferencia NM es 256, y ese es el valor que usa.
- Dado N = 21P53Q4, ¿cuáles serán los pares ordenados (P, Q) de modo que N sea divisible por 44?
- ¿Fueron todos los hallazgos de Ramanujan antes de conocer a Hardy simplemente una conjetura?
- ¿Es difícil probar el último teorema de Fermat para el caso n = 3?
- ¿La prueba de primalidad AKS demuestra que los primos están en P para cualquier anillo conmutativo? Si no, ¿se puede extender para hacerlo?
- Cuando un polinomio f (x) se divide por (x-1) y (x-2), deja el resto 5 y 7 respectivamente. ¿Cuál es el resto cuando se divide por (x-1) (x-2)?
Tenga en cuenta que lo anterior es una forma puramente matemática para describir el comportamiento. Otra forma de describirlo es representar el número M en la notación binaria del complemento a dos, y luego truncar todos los bits de orden superior que no encajan en el tipo de destino. Sin embargo, si no sabe cuál es la notación binaria del complemento a dos, eso no ayuda mucho.
También tenga en cuenta que la forma en que se describe anteriormente conserva el comportamiento de la suma, resta y multiplicación. Entonces, si tiene dos enteros A y B, sin tener en cuenta ningún rango en particular, entonces todos estos son verdaderos:
- (unsigned char) (A + B) es igual a (unsigned char) (A) + (unsigned char) (B)
- (unsigned char) (AB) es igual a (unsigned char) (A) – (unsigned char) (B)
- (unsigned char) (A * B) es igual a (unsigned char) (A) * (unsigned char) (B)
El comportamiento de división (y módulo) no se conserva.