C有关问题疑惑,求解释

C问题疑惑,求解释!
#include <stdio.h>

typedef union{
char a;
unsigned char x:2;
unsigned char y:3;
unsigned char z:3;
}DATA;


int main(void)
{
DATA u;
u.a = 0x75;
printf("%d, %d, %d\n", u.x, u.y, u.z);
return 0;
}
结果是1,5,5请问是为啥呢?
当我把联合体里面的unsigned去掉后,结果又不同,请问这是为啥?

------解决方案--------------------
u.a = 0x75 = 01110101,所以:
u.x = 01
u.y = 101
u.z = 101
这样有符号和没符号是有区别的,因为u.y和u.z的符号位为1,会变成负数。
另外,我估计你的本意是这样的,忘了加struct了:
C/C++ code

typedef union{
char a;
struct
{
unsigned char x:2;
unsigned char y:3;
unsigned char z:3;
}
}DATA;

------解决方案--------------------
0X75 = 0111 0101 (十进制是117)
u.a = 0x75;
unsigned char x:2 --->位域 表明只是用前两位 即0111 0101 红色部分
unsigned char y:3 --->位域 表明只是用前两位 即0111 0101 红色部分
同理z也是这样的
------解决方案--------------------
C/C++ code
#include <stdio.h>

typedef union{
    char a;
     //  char 是 有符号数  最高位代表 符号位  其他的为数据位
    char x:2;
    char y:3;
    char z:3;

}DATA;


int main(void)
{
    DATA u;

    u.a = 0x75;  // 8位  0111 0101
    
    // u.x = 01 //高位 是0 代表 符号位
    printf("%d, %d, %d\n", u.x, u.y, u.z);  //   101(源码)--》 111(补码) 只占三位
    //------》(int )u.x ---->  int四个字节  源码 101 ----》   0x ff ff ff f前28位 
    //后 四位 // 1011
    return 0;
}