2011-07-02 21 views
7
main() 
{ 
    unsigned x=1; 
    char y=-1; 

    if(x>y) 
      printf("x>y"); 
    else 
     printf("x<=y"); 
} 

I expected x> y. pero cuando cambié unsigned int a signed int, obtuve los resultados esperados.¿Por qué un unsigned int 1 es menor que un char y -1?

+0

char y = -1; debería lanzar un error, creo que debería ser char y = '- 1' en su lugar – Devjosh

+0

@Devjosh, no te equivocas. '-1' no es un personaje válido. – taskinoor

+0

@Devjosh: ''-1'' arroja una advertencia porque en realidad es'' -'' y ''1'' combinados, no el número" -1 ". Este último es ignorado. – Lekensteyn

Respuesta

11

Si char es equivalente a signed char:

  • char es promovido a int (Promociones INTEGER, ISO C99 §6.3.1.1 ¶2)
  • Desde int y unsigned tener el mismo rango, int se convierte a unsigned (Conversiones aritméticas, ISO C99 §6.3.1.8)

Si char es equivalente a unsigned char:

  • char pueden ser promovidos al ya sea int o unsigned int:
    • Si int puede representar todos los valores unsigned char (típicamente porque sizeof(int) > sizeof(char)), char se convierte en int.
    • De lo contrario (normalmente porque sizeof(char)==sizeof(int)), char se convierte en unsigned.
  • Ahora tenemos un operando que es ya sea int o unsigned, y otro que es unsigned. El primer operando se convierte a unsigned.

promociones entero: Una expresión de un tipo de rango inferior que int se convierte en int si int puede contener todos los valores del tipo original, a unsigned lo contrario.

Conversiones aritméticas: Intente hacer una conversión al tipo más grande. Cuando hay un conflicto entre firmado y sin firmar, si el tipo más grande (incluido el caso en el que los dos tipos tienen el mismo rango) es unsigned, vaya con unsigned. De lo contrario, vaya con firmado solo en el caso de que pueda representar todos los valores de ambos tipos.

Conversiones a entero tipos (ISO C99 §6.3.1.3):

La conversión de un valor fuera de rango a un tipo entero sin signo se realiza a través wrap-around (aritmética modular).

La conversión de un valor fuera de rango a un tipo entero con signo está definida en la implementación, y puede generar una señal (como SIGFPE).

+0

Editado: lapso mental debido a la falta de sueño. – ninjalj

+1

+1 respuesta detallada y correcta. (Y porque casi siempre +1 decente respuestas correctas cuando la respuesta aceptada es incorrecta.) –

4

Al utilizar las operaciones con signo y sin signo en una sola operación, el firmado se promocionó a no firmado mediante la conversión de tipo automática de C. Si el patrón de bits de -1 se considera un número sin signo, entonces tiene un valor muy alto. Entonces x > y es falso.

+1

@taskinoor: No importa cuál sea el patrón de bits de -1 "considerado como un número sin signo", es el valor que importa cuando se convierte a un tipo sin signo. –

+0

@ Charles Bailey, eso es lo que quise decir. Puede ser que mi lenguaje no sea lo suficientemente bueno. – taskinoor

+3

@taskinoor: Cuando hablas del patrón de bits de -1, me parece que implicabas que la promoción implícita de 'char' a' unsigned' depende de la representación subyacente de un 'char' en la implementación (ej. complemento de dos) que no es correcto. –

Cuestiones relacionadas