Chinaunix首页 | 论坛 | 博客
  • 博客访问: 280094
  • 博文数量: 42
  • 博客积分: 590
  • 博客等级: 中士
  • 技术积分: 447
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-04 01:15
个人简介

健康快乐 虚怀若谷 淡定从容

文章分类

全部博文(42)

分类: C/C++

2011-07-24 22:51:46

操作系统:WIN7 32位家庭版, XP
编译环境:C-FREE5.0
编译器:  标准C89(32位)
 
代码1:
 
#include
#include
int main(void)
{
/*
   unsigned short i;
   unsigned short j;
   unsigned short k;*/
 short i;
 short j;
 short 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 != ~j\n");
 }
 if(i == k){
  printf("i == k\n");
 }
 else{
  printf("i != k\n");
 }
 return 1;
}
运行结果:
 
#include
#include
int main(void)
{
   unsigned short i;
   unsigned short j;
   unsigned short k;
/*
 short i;
 short j;
 short 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 != ~j\n");
 }
 if(i == k){
  printf("i == k\n");
 }
 else{
  printf("i != k\n");
 }
 return 1;
}
 
运行结果如下:
 
只要懂得数据在内存中存储的形式和按位取反的意义,相信理解上面两段代码就不成问题了。这确实是C里面最基本的概念了,但最近写代码时却没想起来,直接使用形式“if(i == ~j)”,很显然,这样是很危险的,尤其是当定义i和j为无符号数据类型时,很可能不会得出想要的结果。 然而,神奇的是,定义的无符号字符型数据经过keil C51编译器编译之后在8位51单片机上跑,正常;而用IAR编译器编译过之后,就会出现异常,推测应该是keilC51编译器进行了一些特殊处理吧。。。 为了保证万无一失,最好是进行取反运算之后,对其结果进行强制类型转换,比如赋给一个变量,然后再进行比较或者其他运算。
阅读(4228) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~