I defined a struct named queryData like the code below. When I tried to using shift and right operation to operate and assign a data, qdata.data.data4[0], printing the data out, there is something wrong that the data I stated before is a char which is 8 bits, but when I print it it actually 32 bits,0xffffff8b. I wonder how it could be like this. Thank you.
int main(void){
    union Data{
        char data2[2];
        char data4[4];
    };
    struct queryData{
        char byte; // 2bytes or 4bytes.
        union Data data;
    };
    struct queryData qdata;
    unsigned long int data;
    data = rand()%4294967295;
    qdata.byte = 4;
    qdata.data.data4[0] = (char)(data>>24);
    qdata.data.data4[1] = (char)((data<<8)>>24);
    qdata.data.data4[2] = (char)((data<<16)>>24);
    qdata.data.data4[3] = (char)((data<<24)>>24);
    printf("%ld\n",data);
    printf("%x\n",qdata.data.data4[0]);
    printf("%x\n",qdata.data.data4[1]);
    printf("%x\n",qdata.data.data4[2]);
    printf("%x\n",qdata.data.data4[3]);
    printf("%x",(unsigned int)(1804289383<<8)>>24); 
    return EXIT_SUCCESS;
}
The result is below: The result after run
 
     
     
    