2012-03-15 9 views
5

Estoy confundido acerca de cómo se produce la promoción de tipo en caso de printf y en general. He probado el siguiente códigotipo de impresión promoción y extensión de signo

unsigned char uc = 255 
signed char sc = -128 

printf("unsigned char value = %d \n", uc); 
printf("signed char value = %d \n", sc); 

Esto da el siguiente resultado:

unsigned char value = 255 
signed char value = -128 

Esto me ha dejado preguntándose acerca de cómo se realice efectivamente la promoción y si una extensión de signo sucede o no. Si se hace una extensión de signo, entonces el valor 255 se debe imprimir como valor negativo (-128 restante igual) y si no se hace extensión de signo, entonces -128 debería haberse impreso como un valor positivo (255 restantes iguales). Por favor explique.

Respuesta

4

Si una extensión de signo se realiza entonces el valor 255 debe ser impreso como valor negativo

Aquí es donde estás equivocado - todos los valores de tipo unsigned char incluyendo 255, pueden ser representados en un int , por lo que la promoción a int desde unsigned char simplemente sucede sin ningún tipo de negocio divertido.

Donde ocurren problemas es cuando un valor con signo debe ser convertido (que es una cosa diferente a la promoción, y ocurre para crear un tipo común para operandos) a un valor sin signo. Si ese tipo firmado tiene un valor negativo, la conversión a un tipo sin firmar cambiará el valor.

En resumen, la promoción entera conserva el valor (incluido el signo), la conversión puede cambiar el valor.

2

La extensión de la señal está lista. Pero no puede firmar extender un unsigned char porque no tiene un bit de signo. El objetivo de la extensión de signo es mantener el mismo valor. O, si prefiere pensarlo de esta manera, cada variable sin signo tiene un bit de signo cero implícito. Entonces, cuando se extiende la firma a un tipo con signo más grande, el bit de signo debe ser cero en el tipo más grande.

0

La extensión de la señal está lista.

Pero desde el caso de uc, no hay ningún signo, ya que es un unsigned char, por lo que se deja positivo.

1

Ambos se promocionan a enteros, de ahí que sigan el signo.

4

Una función va_arg no tiene información sobre el tipo esperado para la pieza .... Por lo tanto, se aplican las reglas de promoción para funciones declaradas sin prototipo. Esto significa que todos los tipos que son más cortos que int se promocionan a int o directamente. Entonces su función printf nunca ve un (un)signed char.

Cuestiones relacionadas