2011-06-07 24 views
7

Cuando multiplico dos caracteres sin signo de C como este:se desborda al multiplicar caracteres sin signo?

unsigned char a = 200; 
unsigned char b = 200; 
unsigned char c = a * b; 

Entonces sé que voy a tener un exceso de capacidad, y me sale (40'000 módulo 256) como resultado. Cuando hago esto:

unsigned char a = 200; 
unsigned char b = 200; 
unsigned int c = (int)a * (int)b; 

Voy a obtener el resultado correcto 40'000. Sin embargo, no sé qué pasa con esto:

unsigned char a = 200; 
unsigned char b = 200; 
unsigned int c = a * b; 

puedo estar seguro de lo correcto pasa? ¿Es este compilador dependiente? Del mismo modo, no sé lo que sucede cuando se hace una resta:

unsigned char a = 1; 
unsigned char b = 2; 
int c = a - b; 

Al hacer "c" un unsigned char, probablemente obtener 255 como resultado. ¿Qué sucede cuando uso un int como este?

Respuesta

7

Argumento de los operadores aritméticos obtener las "promociones aritméticas habituales".

En los casos en int puede representar todos los valores de todos los operandos (al que es el caso de su ejemplo en la mayoría de las implementaciones), argumentos se convierten primero a int. Entonces, en ambos casos, obtienes el resultado correcto.

+0

Sí, "promoción" era la palabra clave. Aquí encontré un poco más de detalle: https://www.securecoding.cert.org/confluence/display/seccode/INT02-C.+Understand+integer+conversion+rules –

1

Copiado de esta respuesta In a C expression where unsigned int and signed int are present, which type will be promoted to what type?

6.3.1.3 Firmado y enteros sin signo

1 Cuando un valor con el tipo de número entero se convierte en otro tipo entero distinto de _Bool, si el valor puede ser representado por el nuevo tipo, no se modifica.

2 De lo contrario, si el nuevo tipo no está firmado, el valor se convierte sumando o> restando uno más que el valor máximo que se puede representar en el nuevo tipo hasta que el> valor esté en el rango del nuevo tipo .

3 De lo contrario, el nuevo tipo se firma y el valor no puede ser representado en ella; el resultado> es definido por la implementación o se genera una señal definida por la implementación.

Cuestiones relacionadas