In 2's compliment, the high bit is negative. Therefore if you have a 2-bit value, its range is [-2..1]. If you want the range to be [0..3], then you must make the variable unsigned:
x can only contain two bits, to which you're assigning binary 10. When you pass p.x to printf(), the value is converted to int and sign extension is applied: 10b becomes 11111111 11111111 11111111 11111110b (assuming 32-bit ints), which in two's complement is -2.
If you want to be able to store 2, either using unsigned instead of int, or give at least three bits to each member.