读书人

C有关问题疑惑求解释

发布时间: 2012-11-09 10:18:47 作者: rapoo

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;} 

读书人网 >C语言

热点推荐