2010-03-04 4 views
-4

Lors de l'affectation de long à court, LSB 2 octets est 0, où MSB est rempli avec des valeurs provenant des valeurs de l'algorithme func1() de la pile. Pourquoi cela se produit-il, pourquoi le compilateur essaie-t-il d'obtenir ces valeurs indésirables sur les 2 octets MSB?Affectation longue non signée courte à non signée

#include <stdio.h> 

unsigned short func1(void); // NB: function prototype ! 

int main(void) 

{ 

    unsigned long int L = 0; 

    unsigned short K = 0; 

    L = func1(); 

     printf("%lu", L); // prints junk values 

     K = L; 

     printf("%u", K); // prints 0 

    return 0; 
} 

unsigned short func1(void) 

{ 

     unsigned short i = 0; 

     // Algorithm Logic!!! 

     return i; // returns 0 
} 
+0

Il vous manque des types de retour et des prototypes. func1() renvoie int, pas court. –

+1

Vous avez copié et collé le code fixe que j'ai fourni mais vous n'avez pas dit si cela répond maintenant au problème perçu? –

Répondre

5

Le spécificateur pour unsigned long est lu. Celui pour unsigned short est hu. Vous invoquez UB en n'utilisant pas les spécificateurs appropriés.

+0

En supposant que la plage de 'short non signé 's'intègre dans' int' sur la plate-forme de l'OP, le '% d' est parfait dans le premier' printf', puisque la valeur 'unsigned short' sera promue' int' quand passé à 'printf'. La seconde 'printf' est incorrecte cependant. – AnT

+0

@dirkgently: ??? En langage C, les promotions par défaut sont toujours appliquées aux arguments variadiques, comme dans le cas de 'printf'. En fait, les promotions d'argument par défaut sont * seulement * appliquées aux paramètres non déclarés (variadique ou pas de prototype). C'est pourquoi ils s'appellent * default *. Lorsque les paramètres sont déclarés, la conversion n'est pas * default *, mais plutôt spécifique. – AnT

+0

Ouais. J'avais manqué 6.5.2.2 para 7. – dirkgently

0

Il y a un certain nombre de problèmes avec votre code - voici une version corrigée qui devrait se comporter correctement.

#include <stdio.h> 

unsigned short func1(void); // NB: function prototype ! 

int main(void) 
{ 
    unsigned long int L = 0; 
    unsigned short K = 0; 

    L = func1(); 
    printf("%lu", L); 
    K = L; 
    printf("%u", K); 

    return 0; 
} 

unsigned short func1(void) 
{ 
    unsigned short i = 0; 

    // Algorithm Logic!!! 

    return i; // returns 0 
} 
+0

Salut Paul, Même avec les changements, cela n'a pas fonctionné. Je vois MSB rempli de valeurs indésirables et LSB avec 0. Est-ce un problème de compilateur? – Pradna

+1

Comment voyez-vous cela? Quelle sortie produit exactement le programme ci-dessus sur votre système - et quel compilateur utilisez-vous? – nos

+0

@Pradna - le code ci-dessus se compile sans avertissement avec 'gcc -Wall' et génère la sortie attendue (0 dans les deux cas). Quel compilateur et OS utilisez-vous? –

Questions connexes