操作系统: windows 732位家庭版,XP
编译环境: C-FREE5.0
编译器:标准c89(32位)
代码1 :
#include#includeintmain(void ) )。
{
/*
无符号短整型;
无符号短j;
无符号短整型; */
短I;
short j;
短k;
i=0;
j=0xffff;
k=~j;
printf(I=%d,),I );
printf(%x(n ),I );
printf('j=%d,',j );
printf(%x(n ),j );
printf('k=%d,',k );
printf(%x(n ),k );
printf((I=%d,),),I );
printf(%x(n )、~i );
printf () (j=%d,),~j );
printf(%x(n )、~j );
if(I==~j ) {
printf(I==~j(n );
}
else{
printf(I!=~jn ';
}
if(I==k ) {
printf(I==k(n );
}
else{
printf(I!=kn ';
}
返回1;
}
执行结果:
#include#includeintmain(void ) )。
{
无符号短整型;
无符号短j;
无符号短整型;
/*
短I;
short j;
短k; */
i=0;
j=0xffff;
k=~j;
printf(I=%d,),I );
printf(%x(n ),I );
printf('j=%d,',j );
printf(%x(n ),j );
printf('k=%d,',k );
printf(%x(n ),k );
printf((I=%d,),),I );
printf(%x(n )、~i );
printf () (j=%d,),~j );
printf(%x(n )、~j );
if(I==~j ) {
printf(I==~j(n );
}
else{
printf(I!=~jn ';
}
if(I==k ) {
printf(I==k(n );
}
else{
printf(I!=kn ';
}
返回1;
}
执行结果如下。
如果知道数据以内存中存储的形式和位为单位取反的意思,理解上面的两个代码就没问题了。 这确实是c中最基本的概念,但最近写代码时想不起来,直接使用形式“if(I==~j )”,显然很危险。 特别是,如果将I和j定义为无符号数据类型,则很可能得不到所需的结果。 但奇怪的是,定义的无符号字符类型数据在keil C51编译器编译后,在8位51单片机上运行,正常; 用IAR编译器编译后,发生了异常。 推测是keilC51编译器做了某种特别的处理吧。 为了确保万无一失,希望在进行逆运算后,对其结果进行强制的模型变换。 例如,分配给一个变量后,进行比较和其他运算。