Output of C program | Set 25

Last Updated : 23 Jul, 2025
Predict the output of following C program. C
int main(void)
{
    struct str
    {
        int i: 1;
        int j: 2;
        int k: 3;
        int l: 4;
    };

    struct str s;

    s.i = 1;
    s.j = 2;
    s.k = 5;
    s.l = 10;

    printf(" i: %d \n j: %d \n k: %d \n l: %d \n", s.i, s.j, s.k, s.l);

    getchar();
    return 0;
}
The above code is non-portable and output is compiler dependent. We get following output using GCC compiler for intel 32 bit machine.
  [narendra@ubuntu]$ ./structure
  i: -1
  j: -2
  k: -3
  l: -6
Let us take a closer look at declaration of structure. C
struct str
{
    int i: 1;
    int j: 2;
    int k: 3;
    int l: 4;
};
In the structure declaration, for structure member ā€˜i’, we used width of bit field as 1, width of 'j' as 2, and so on. At first, it looks we can store values in range [0-1] for 'i', range [0-3] for 'j', and so on. But in the above declaration, type of bit fields is integer (signed). That’s why out of available bits, 1 bit is used to store sign information. So for 'i', the values we can store are 0 or -1 (for a machine that uses two's complement to store signed integers). For variable ā€˜k’, number of bits is 3. Out of these 3 bits, 2 bits are used to store data and 1 bit is used to store sign. Let use declare structure members as ā€œunsigned intā€ and check output. C
int main(void)
{
    struct str
    {
        unsigned int i: 1;
        unsigned int j: 2;
        unsigned int k: 3;
        unsigned int l: 4;
    };
    struct str s;

    s.i = 1;
    s.j = 2;
    s.k = 5;
    s.l = 10;

    printf(" i: %d \n j: %d \n k: %d \n l: %d \n", s.i, s.j, s.k, s.l);

    getchar();
    return 0;
}
output:
  [narendra@ubuntu]$ ./structure
  i: 1
  j: 2
  k: 5
  l: 10
This article is compiled by ā€œNarendra Kangralkarā€œ and reviewed by GeeksforGeeks team.
Comment