edited by
1,310 views
3 votes
3 votes
#include<stdio.h>
int main() {
  int i = 0x1 << sizeof(int)*8-1;
  printf("\n%x",i);
  i = i >> sizeof(int)*8-1;
  printf("%d",i);
}

Find the output ? 

edited by

1 Answer

1 votes
1 votes

$\begin{align*} &\text{0x}1 << \text{sizeof}(int)*8 -1 = 10000000 00000000 00000000 00000000 \\ & \qquad \qquad\qquad\qquad\qquad\quad \; = \underbrace{1000}\underbrace{0000}\underbrace{0000}\underbrace{0000}\underbrace{0000}\underbrace{0000}\underbrace{0000}\underbrace{0000} \\ &\qquad \qquad\qquad\qquad\qquad\quad \; =\;\;\;8\quad\;\;0\quad\;\;0\quad\;\;\;0\quad\;\;0\quad\;\;\;0\quad\;\;0\quad\;\;0 \\ &\qquad \qquad\qquad\qquad\qquad\quad \; = 80000000 \quad \text{ in HEXA}\\ \end{align*}$

And, for the right shift part of signed int, it has implementation defined behaviour. 

please check this and this

In my system ( gcc in windows ) MSB is copied in empty bits after every bit of right shift. So $i$ becomes $= 2^{32} - 1 = 4294967295$

#include <stdio.h>
int main() {
  int j;
  int i=0x1 << sizeof(int)*8-1; // 1 << 31
  printf("\nsizeof(int)*8-1 = %u\n",sizeof(int)*8-1);
  printf("bit content of i = ");
  for(j = (sizeof(int)<<3) -1;j>=0;j--) (i&(1<<j))?printf("1"):printf("0"); 
  printf("\ni in hexa = %x",i);
  printf("\ni as signed int = %d",i);
  printf("\ni as unsigned int = %u\n\n",i);
  
  i = i >>  sizeof(int)*8-1; // i >> 31 sign bit is replicated
  printf("bit content of i = ");
  for(j = (sizeof(int)<<3) -1;j>=0;j--) (i&(1<<j))?printf("1"):printf("0");
  printf("\ni in hexa = %x",i);
  printf("\ni as signed int = %d",i);
  printf("\ni as unsigned int = %u\n",i);
}
// output :

sizeof(int)*8-1 = 31
bit content of i = 10000000000000000000000000000000
i in hexa = 80000000
i as signed int = -2147483648
i as unsigned int = 2147483648

bit content of i = 11111111111111111111111111111111
i in hexa = ffffffff
i as signed int = -1
i as unsigned int = 4294967295

Same code with unsigned int $i$ in gcc.

#include <stdio.h>
int main() {
	  int j;
    unsigned int i=0x1 << sizeof(int)*8-1; // 1 << 31
    printf("\nsizeof(int)*8-1 = %u\n",sizeof(int)*8-1);
    printf("bit content of i = ");
    for(j = (sizeof(int)<<3) -1;j>=0;j--) (i&(1<<j))?printf("1"):printf("0"); 
    printf("\ni in hexa = %x",i);
    printf("\ni as signed int = %d",i);
	  printf("\ni as unsigned int = %u\n\n",i);
    
    i = i >>  sizeof(int)*8-1; // i >> 31
    printf("bit content of i = ");
    for(j = (sizeof(int)<<3) -1;j>=0;j--) (i&(1<<j))?printf("1"):printf("0");
    printf("\ni in hexa = %x",i);
    printf("\ni as signed int = %d",i);
	  printf("\ni as unsigned int = %u\n",i);
}
// output :

sizeof(int)*8-1 = 31
bit content of i = 10000000000000000000000000000000
i in hexa = 80000000
i as signed int = -2147483648
i as unsigned int = 2147483648

bit content of i = 00000000000000000000000000000001
i in hexa = 1
i as signed int = 1
i as unsigned int = 1
edited by

Related questions

0 votes
0 votes
1 answer
1
Rudra Pratap asked Jun 25, 2017
501 views
#include<stdio.h>int main(){ int x=20; printf("%d %d ",x ,++x);}unable to understand how it prints the output. plz help
0 votes
0 votes
1 answer
2
Pragya asked Mar 29, 2017
1,135 views
I am unable to understand the error code. What does 'invalid conversion from int to int mean ? plz help.The code-#include <stdio.h>int function(int *);int main(){ int ...
0 votes
0 votes
1 answer
3
ranarajesh495 asked Oct 9, 2018
591 views
If we are taking character as input then how we can check the character against a a range of numbers. Please explain
1 votes
1 votes
0 answers
4
KashishNarang asked Aug 23, 2018
266 views
Output will be-int main(){ int a =0,b=1,c=3:*((a)?&b&:&a)=a ? b : c;printf("%d %d%d ", a,b,c);}