2010-09-17 3 views
2

Je suis assez nouveau pour C. Je suis récemment tombé sur ce morceau de code en C:et modificateurs de types de données en C datatype

#include <stdio.h> 

int main() 
{ 
     unsigned Abc = 1; 
     signed Xyz = -1; 

     if(Abc<Xyz) 
       printf("Less"); 
     else 
     if(Abc>Xyz) 
       printf("Great"); 
     else 
     if(Abc==Xyz) 
     printf("Equal"); 
     return 0; 
} 

J'ai essayé de l'exécuter et les sorties « Moins ». Comment ça marche? Quelle est la signification de Abc non signé? Je pourrais comprendre non signé char Abc, mais simplement non signé Abc? Je suis assez sûr que Abc n'est pas un type de données! Comment (et pourquoi?) Cela fonctionne-t-il?

+3

Même si le « ' int' comme type par défaut » comportement fait partie de la norme C, il est généralement préféré si vous écrivez explicitement' int' non signé au lieu de laisser le compilateur le remplir pour vous. C'est moins sujette aux erreurs et plus facile à lire (comme en témoigne votre confusion ici). – bta

Répondre

1

Le type par défaut dans C est int. Par conséquent unsigned est un synonyme de unsigned int.

Les entiers singulés sont généralement traités en utilisant un complément à deux. Cela signifie que la valeur réelle pour 1 est 0x0001 et que la valeur réelle pour -1 est 0xFFFF.

+0

N'oublions pas les 25 ans de i386 ... –

1

Pour autant que je sache, la valeur signé est promu une valeur non signée et ainsi devient très grand.

1

int est le type "par défaut" en C. unsigned Abc signifie unsigned int Abc comme long L signifie long int L.

Lorsque vous avez une expression qui mélange signés et non signés ints, les ints signés sont automatiquement converties en non signé. La plupart des systèmes utilisent le complément à deux pour stocker des entiers, donc (unsigned int)(-1) est égal au plus grand possible unsigned int.

5

Deux choses se produisent.

  1. Le type de données par défaut dans C dans int. Ainsi, vous avez des variables de type signed int et unsigned int.

  2. Quand et unsigned int et un int signé sont utilisés dans une expression l'int signé est converti en unsigned avant l'expression est évaluée. Cela signifiera que signed (-1) deviendra un très grand nombre non signé (en raison de la représentation du complément à 2).

0

non signé/signé est juste avant la spécification pour int (source) int/signé non signé, donc non, vous n'avez pas variable "aucun type de données"

1

Comparant types signés et non signés résultent dans comportement indéfini. Votre programme peut et va imprimer des résultats différents sur différentes plates-formes.

S'il vous plaît voir les commentaires.

+0

Impossible de trouver le lien actuel pour l'instant, mais je crois comprendre que la promotion int (signée pour non signée dans ce cas particulier) est bien définie. Mais quoi qu'il en soit, ce n'est pas intuitif pour un débutant. – Detmar

+0

@Detmar: ah ... hmmm doit vérifier la norme. Cela peut être différent pour C et C++. Si je me souviens bien, rien (ou peu?) N'est dit sur la représentation binaire des entiers signés, c'est ce qui me fait penser que c'est UB. –

+0

-1: Non, c'est un comportement bien défini. Ce qui se passe, et c'est normatif en C, est ce que Darron décrit dans sa réponse. –

0

La valeur sera signée à obtenir une promotion non signé et donc il sera plus grand que 1.

0

Ajoutez la ligne suivante après signé xyz = -1;

 
printf("is Abc => %x less than Xyz => %x\n",Abc,Xyz); 

et de voir le résultat par vous-même.

+0

Encore mieux serait d'utiliser '% u' pour les formats. –

Questions connexes