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了:
#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; }