printf("%d\n", (unsigned char)255 * (unsigned char)255);La salida del código anterior es 65025 pero no 1 (255 * 255 (mod 256)). ¿Por qué?
El operador de multiplicación * aplica las conversiones aritméticas habituales a sus operandos. Estas conversiones convierten los operandos char unsigned en int . Vea la respuesta de pmg para la referencia estándar.
Aparentemente, en su sistema, el tipo int es lo suficientemente amplio como para contener el valor de resultado 65025 . En un sistema con int de 16 bits, donde INT_MAX == 32767 , la multiplicación daría como resultado un desbordamiento, lo que provocaría un comportamiento indefinido (normalmente, los bits de orden superior del resultado se descartarían). La mayoría de los sistemas modernos tienen int de 32 bits.
No existe un operador de multiplicación para tipos enteros más estrechos que int o unsigned int .
(Estrictamente hablando, es posible que los operandos se puedan convertir a unsigned int en lugar de a int . Eso sucedería solo si unsigned int puede representar el rango completo de unsigned char , pero int no puede, y eso no puede suceder en un sistema con 8 char .)
Los operandos a * se someten a las "conversiones aritméticas habituales" (C11 Standard p6.3.1.8).
Ver también p6.5.5.2: Operadores multiplicativos
Semántica
Las conversiones aritméticas habituales se realizan en los operandos.