这段代码的运算是怎么进行的呀


#include <stdio.h>

int main()
{
    unsigned a=0112,x,y,z;
    x=a>>3;
    printf("x=%o\n",x);
    y=~(~0<<4);
    printf("y=%o\n",y);
    z=x&y;
    printf("z=%o\n",z);
   
 
}

这段代码,怎么运行的呀,还有那些运算符号是什么意思呀,求详解
还有这段

#include <stdio.h>
#include <math.h>
int main()
{
double a,b,c,d;
a=2.5+10%3*(int)(2.5+4.7)%2/4;
b=(float)(2+3)/2+(int)3.5%(int)2.5;
c=1^(2<<2);
d=1|2&2;
printf("%lf\n%lf\n%lf\n%lf\n",a,b,c,d);
}

0112是8进制,>>是位运算,先把112转换成2进制(001001010)然后右移3位(1001),相当于十进制除以8