2017-05-10 4 views
0

Warum Ausgang des folgenden Codes ist -1 und -2, Es sollte 1 und 2 sein, richtig?Warum gibt der folgende Code -1 und -2 aus?

Auch auf einer 64-Bit-Server-Größe der folgenden Struktur ist 4 Bytes, sollte es 8 Bytes richtig sein?

#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

Sie erhalten die Antwort als '-1 und -2' oder' -1 und 2'? –

+0

@SouravGhosh -1 und -2 Sir – Chirag

+0

"Es sollte 1 und 2 sein, oder?" Nein, warum sollte es so sein? – Gerhardh

Antwort

3

Compile mit allen Warnungen aktiviert ist, und liest, was den Compiler sagt:

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, dass

ein signiertes 1-Bit-Variable nur zwei Werte halten können, -1 und 0

wie Sie in diesem answer sehen können.

Also, wenn Sie diese verwenden struct statt:

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

Sie die gewünschte Ausgabe erhalten wird.


Diese answer gibt eine nette Erklärung.

+1

Danke ......... – Chirag

+0

Sie sind willkommen @Chirag, ich aktualisierte meine Antwort mit einer funktionierenden Struktur, hoffe, dass dies für die Akzeptanz genug sein wird! :) – gsamaras

+0

Ja, mir ist sehr klar mit diesem Konzept, Danke für die Hilfe – Chirag

Verwandte Themen