| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 966 人关注过本帖
标题:一个昨天没有解决的问题
只看楼主 加入收藏
feng00055
Rank: 2
等 级:论坛游民
帖 子:56
专家分:27
注 册:2009-8-26
收藏
得分:0 
我比较了一下:

int main(int argc, char *argv[])
{
   struct packed_date  
{  
unsigned a:8;  
}A,B;  
A.a=0XFF;  
B.a=A.a&0XAA;  
printf("%X\n",B.a);  
 return 0;
}

TC的结果为:AA     Pelles C的结果为:FF
2009-10-28 20:52
feng00055
Rank: 2
等 级:论坛游民
帖 子:56
专家分:27
注 册:2009-8-26
收藏
得分:0 
郁闷!应该是IDE的问题
2009-10-28 20:55
feng00055
Rank: 2
等 级:论坛游民
帖 子:56
专家分:27
注 册:2009-8-26
收藏
得分:0 
int main(int argc, char *argv[])
{
   struct packed_date
   {
   int a:8;
   }A,B;
   A.a=0XFF;
   B.a=A.a&0XAA;
   printf("%X\n",B.a);
   return 0;
   }

Tc的结果为:FFAA
我就纳闷了:0XAA的二进位:0000000010101010,
任凭A.a是多少,结果也不可能是FFAA,难道0XAA
为:1111111110101010,一定是我哪弄错了,哪位
大虾能帮帮我?
2009-10-28 21:43
计少
Rank: 2
等 级:论坛游民
帖 子:27
专家分:24
注 册:2009-6-23
收藏
得分:4 
内存对齐,
struct packed_date  
   {  
   int a:8;  
   }A,B;
这里面你的a是整数值,所以按照Tc编译器有16位,但是你实际只用了8位,那么剩下的位数怎么办?
ok,这里就是前面补1和补0的问题了,如果你赋值给的a的值最高位为1补1,为0则补0,原因是编译器认为赋值最高位为1的时候为负数,是用补码表示。
楼主可调试下如下程序便于理解。
int main(int argc, char *argv[])
{
    struct packed_data
    {
        int a : 8;
         
    }A,B;
      A.a=0XBF;
    printf("%d,%x\n",A.a,A.a);
      B.a=A.a&0XAA;
    printf("%X\n",B.a);
      return 0;
}

[ 本帖最后由 计少 于 2009-10-29 08:34 编辑 ]
2009-10-28 22:44
feng00055
Rank: 2
等 级:论坛游民
帖 子:56
专家分:27
注 册:2009-8-26
收藏
得分:0 
这么看来,虽然本题中的0XAA没有定义,
但已默认为和它的运算项相同的类型,&时
补成16位!
2009-10-29 07:47
计少
Rank: 2
等 级:论坛游民
帖 子:27
专家分:24
注 册:2009-6-23
收藏
得分:0 
请注意你的0xAA虽然是常量,但是也是占据内存的。编译器都会把你的这个常量值按照它的做法写入内存。
2009-10-29 08:40
feng00055
Rank: 2
等 级:论坛游民
帖 子:56
专家分:27
注 册:2009-8-26
收藏
得分:0 
我总结了一下,请问在Pelles C中位运算的规律到底是什么?

int main(int argc, char *argv[])                     
{
   struct packed_date
   {
   unsigned a:4;
   }A,B;
   A.a=0X5;
   B.a=A.a & 0XA;
   printf("%X\n",B.a);
   return 0;
   }
 
TC的结果:0      Pelles C:5
 
int main(int argc, char *argv[])
{
   struct packed_date
   {
   unsigned a:4;
   }A,B;
   A.a=0XA;
   B.a=A.a & 0X5;
   printf("%X\n",B.a);
   return 0;
   }
 
TC:0      PC:A
 
int main(int argc, char *argv[])
{
   struct packed_date
   {
   unsigned a:4;
   }A,B;
   A.a=0XA;
   B.a=A.a & 0XF;
   printf("%X\n",B.a);
   return 0;
   }
 
TC:A    PC:A
 
int main(int argc, char *argv[])
{
   struct packed_date
   {
   unsigned a:4;
   }A,B;
   A.a=0XF;
   B.a=A.a & 0XA;
   printf("%X\n",B.a);
   return 0;
   }
 
TC:A   PC:F
 
int main(int argc, char *argv[])
{
   struct packed_date
   {
   unsigned a:4;
   }A,B;
   A.a=0XA;
   B.a=A.a & 0XF00;
   printf("%X\n",B.a);
   return 0;
   }
 
Tc:0    PC:0
 
 
我手边只有谭的书,上面只以TC为标准讲的
2009-10-29 11:49
快速回复:一个昨天没有解决的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017357 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved