$\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