2017-05-10 2 views
0

Pourquoi la sortie du code ci-dessous est -1 et -2, il devrait être 1 et 2, non?Pourquoi la sortie du code ci-dessous est -1 et -2?

Également sur une taille de serveur 64 bits de la structure ci-dessous est de 4 octets, il devrait être de 8 octets à droite?

#include<stdio.h> 
struct st 
{ 
     int a:1; 
     int b:2; 
}; 
main() 
{ 
     struct st obj={1,2}; 
     printf("a = %d\nb = %d\n",obj.a,obj.b); 
     printf("Size of struct = %d\n",sizeof(obj)); 
} 
+0

vous obtenez la réponse comme «-1 et -2» ou «-1 et 2»? –

+0

@SouravGhosh -1 et -2 Sir – Chirag

+0

"Il devrait être 1 et 2, non?" Non, pourquoi pensez-vous que ça devrait être comme ça? – Gerhardh

Répondre

3

Compile avec tous les avertissements activés et lire ce que votre compilateur dit:

Georgioss-MacBook-Pro:~ gsamaras$ gcc -Wall main.c 
main.c:7:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int] 
main() 
^ 
main.c:9:26: warning: implicit truncation from 'int' to bitfield changes value 
     from 2 to -2 [-Wbitfield-constant-conversion] 
     struct st obj={1,2}; 
         ^
main.c:11:40: warning: format specifies type 'int' but the argument has type 
     'unsigned long' [-Wformat] 
     printf("Size of struct = %d\n",sizeof(obj)); 
           ~~ ^~~~~~~~~~~ 
           %lu 
3 warnings generated. 

Recall, que

a signé 1 variable bit ne peut contenir que deux valeurs, -1 et 0

comme vous pouvez le voir dans ce answer.

Donc, si vous utilisez cette struct place:

struct st 
{ 
     int a:2; 
     int b:3; 
}; 

vous obtiendrez la sortie désirée.


Cette answer donne aussi une bonne explication.

+1

Merci ......... – Chirag

+0

Vous êtes les bienvenus @Chirag, j'ai mis à jour ma réponse avec une structure de travail, j'espère que ce sera suffisant pour l'acceptation! :) – gsamaras

+0

Oui, je suis très clair avec ce concept, merci pour l'aide – Chirag