2010-07-30 30 views
8
#include <stdio.h> 
int main() 
{ 
    unsigned char i=0x80; 
    printf("%d",i<<1); 
    return 0; 
} 

¿Por qué este programa imprime 256?Valor máximo de char sin signo

Según entiendo esto, ya 0x80 = 0b10000000, y unsigned char tiene 8 bits, el '1' debe desbordamiento después de desplazamiento a la izquierda y la salida debe ser 0, no 256.

+2

no quiero publicar como una respuesta porque no estoy 100% seguro, pero no es porque% d es un número entero? Por lo tanto, el código detrás de las escenas probablemente asigna 'i << 1' a un número entero para imprimirlo, lo que significa que se ajusta y no se desborda. Intenta hacer 'printf ("% c ", i << 1);'? – Stephen

+0

@Stephen: Debería haber publicado la respuesta;) – KevenK

+0

@Stephen: La salida está en blanco cuando uso% c. – Variance

Respuesta

14

Este es un resultado de C de reglas enteras de promoción. Esencialmente, la mayoría de las variables que entran en una expresión se "promueven" para que las operaciones de este tipo no pierdan precisión. Luego, se pasa como int a printf, según las reglas de argumentos variables de C.

Si te gustaría lo que está buscando, usted tendría que emitir de nuevo a unsigned char:

#include <stdio.h> 
int main() 
{ 
    unsigned char i=0x80; 
    printf("%d",((unsigned char)(i<<1))); 
    return 0; 
} 

Nota: el uso de %c como se especifica en el comentario de Stephen no funcionará porque %c espera una entero también

EDIT: Como alternativa, se podría hacer esto:

#include <stdio.h> 
int main() 
{ 
    unsigned char i=0x80; 
    unsigned char res = i<<1; 
    printf("%d",res); 
    return 0; 
} 

o

#include <stdio.h> 
int main() 
{ 
    unsigned char i=0x80; 
    printf("%d",(i<<1) & 0xFF); 
    return 0; 
} 
+0

¿Podría convertir '(i << 1)' a 'unsigned char'? – nmichaels

+0

@Nathon: ¿No es eso lo que hice? –

+1

Extraño, debo tener las anteojeras encendidas. – nmichaels

0

no se olvide el formato específicamente para la impresión sin firmar.

printf("%u",(unsigned char)(i<<1)); 
+0

Debido a las reglas de promoción de C, lo más probable es que el argumento pase a' printf' como 'signed int', not' unsigned '. Debería convertir el argumento en un tipo que coincida con el especificador de formato. –

Cuestiones relacionadas