C Programming - Bitwise Operators - Discussion

Discussion Forum : Bitwise Operators - Find Output of Program (Q.No. 5)
5.
What will be the output of the program?
#include<stdio.h>

int main()
{
    unsigned char i = 0x80;
    printf("%d\n", i<<1);
    return 0;
}
0
256
100
80
Answer: Option
Explanation:
No answer description is available. Let's discuss.
Discussion:
65 comments Page 2 of 7.

Mayur said:   9 years ago
Answer to Why everyone taking for char 2bytes?

we are not taking char as 2 bytes.
Let's picture the real scenario, the memory stored in the register of RAM.
for example, suppose 'i' is stored at 0x00 as shown in the below:

Address values
0x06 0000 0000
0x05 0000 0000
0x04 0000 0000
0x03 0000 0000
0x02 0000 0000
0x01 0000 0000
0x00 1000 0000 <----- i = 0x80;

now if we right shift the value of 'i', then MSB(most significant bit) will shifted to the next register* as shown below,

Address values
0x06 0000 0000
0x05 0000 0000
0x04 0000 0000
0x03 0000 0000
0x02 0000 0000
0x01 0000 0001
0x00 0000 0000 <----- i = 0x00;

It should show 0 if we read the value of 'i' as a character(%C) which is NULL(it will print NULL which is not a visible character like space).
But here we are reading the value of 'i' as integer(%d) so it will read the 4 bytes, which are,

0x03 0000 0000
0x02 0000 0000
0x01 0000 0001
0x00 0000 0000

In single line 00000000 00000000 00000001 00000000 <----- i = 0x100 = 256.

@Gopi Krishna, If we right shift the variable then MSB goes to next register's LSB, not the same one in C language.

One you are describing is the case of the microcontroller/processes @Kunal.
(1)

Nagarjun said:   10 years ago
The answer should be zero. I checked it. Unsigned char takes only single byte.

Adam said:   10 years ago
#include<stdio.h>

int main()
{
unsigned char i = 0x80;
int a=i<<1;
unsigned long b=a;
unsigned char c=b;
printf("%d\n",c);
b=b>>1;
c=b;
printf("%d\n",c);
return 0;
}

Try this.

Chandan Kumar said:   10 years ago
@Abhinav.

No, its not correct. 0X80 is a hexadecimal number, and for hexadecimal number you have to convert nibble by nibble.

For example:

0X80 --------> two nibbles 8 0.

1000 0000.

0X 75 -------> 7 5.

0111 0101.

Although, you are right if it were decimal number.

For example:

80 ----------> 01010000.

"0X" makes it hexadecimal.

Supriya said:   1 decade ago
Yes it is correct @Abhinav but when we consider that and tried to shift by 1 then answer goes wrong. Please anyone tell how I convert this hex number into binary.

Abhinav said:   1 decade ago
Here x080 can be written as 0000 0000 0101 0000. Is it true?

Parveen Rohaj said:   1 decade ago
Some are having doubt that why everyone having explanation assuming it is 2 byte?

First clear in you mind that we are not converting 1 byte of character into 2 byte.

Because if we do this then we have to write i = i<<2; but we are just printing a integer value using integer format specifier, but not changing the value of i.

After this program try this.

#include<stdio.h>
int main()
{
unsigned char i = 0x80;
printf("%d\n", i<<1);
printf("%d\n",i);
return 0;
}

I am just want to show that value of i is not changing.

You will get the output as:

256 as value of integer after left shift and 128 as the value of the i.

So don't confuse between both.

Jay said:   1 decade ago
#include<stdio.h>

int main()
{
char i=0x04;
char k=0x80;
printf("%d",i<<6);
printf("%d",k<<1);

return 0;
}

Output of first print statement is 256 while for other it is -256 how?

Gopi krishna said:   1 decade ago
Size of char is 1 byte.
So it have 8 bits. The equivalent of 0*80 is 1000 0000.
If I do left shift then it is 0000 0001 so answer is 1.

This is my thinking. Can any one explain me correct?

Shanthu said:   1 decade ago
Char should overflow to become zero instead its becoming 256.


Post your comments here:

Your comments will be displayed after verification.