操作系统:WIN7 32位家庭版, XP

编译环境:C-FREE5.0

编译器:  标准C89(32位)

代码1:

#include#includeint 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#includeint 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编译器进行了一些特殊处理吧。。。 为了保证万无一失,最好是进行取反运算之后,对其结果进行强制类型转换,比如赋给一个变量,然后再进行比较或者其他运算。

keil c语言中位取反,关于按位取反“~”的故事相关推荐

  1. c51转汇编语言窗口,在C51语言中如何嵌入汇编语言

    keil C 语言中嵌入汇编语言进行混合编程,方法如下: 1.在C 文件中要嵌入汇编代码片以如下方式加入汇编代码 #pragma ASM ; Assembler Code Here #pragma E ...

  2. keil c语言 延迟程序,Keil C51程序设计中几种精确延时方法

    前几天时间在做一个基于51单片机开发板的等精度频率计,用LCD1602液晶显示的,晶振是22.1184MHZ,用得是测频率法,目的是想做到能够测试0--900KHZ的信号. 液晶显示部分花了我好几天才 ...

  3. c语言中按位或赋值给变量,[转载]C语言位运算符在单片机上的应用

    C语言位运算符 学过汇编的朋友都知道汇编对位的处理能力是很强的,但是C语言也能对运算对象进行按位操作,从而使C语言也能具有一定的对 硬件直接进行操作的能力.位运算符的作用是按位对变量进行运算,但是并不 ...

  4. 解析C语言中数据在内存中的存储

    系列文章目录 文章目录 系列文章目录 前言 一.数据类型介绍 1.类型的基本归类 1.整形家族 2.浮点型家族 3.构造类型 4.指针类型 5.空类型 二.整型在内存中的存储 1.原码.反码.补码 2 ...

  5. java语言中声明布尔型_【Java初探02】——Java语言基础

    本篇博文就Java语言的一些基本元素进行一些记录和阐述,主要讲解一下Java语言的一些基本构成元素和Java的主类结构. Java语言基础的大致组成 java主类结构 基本的数据类型 变量与常量 运算 ...

  6. asin c语言中 返回值范围_大学C语言考试易错知识点总结

    作者:cggwz 来源:https://blog.csdn.net/cggwz/article/details/103740713?utm_medium=distribute.pc_relevant. ...

  7. c语言科学计数法_C入门:C语言中数据的储存(上)

    How Data is stored in computer memory? 储存数据是计算机进行各种数据操作的基础,为了理解计算机可以对哪些数据进行怎样的操作,有必要了解数据在计算机中的储存方式. ...

  8. 2个字节能存多少个16进制_Java语言中最大的整数再加1等于多少?看完秒懂

    短文涨姿势,看了不白看,不关注等啥? 已知Java语言中int类型所能表示的最大整数为2147483647,请问以下代码执行结果是什么? 一部分人都会认为这段程序压根就无法通过编译,也有人认为,这段程 ...

  9. 常见位操作及运算应用举例:1,C语言中位运算符异或“∧”的作用​​​​​​​2,异或运算的作用3,(与运算)、|(或运算)、^(异或运算)

    1 C语言中位运算符异或"∧"的作用: 异或运算符∧也称XOR运算符.它的规则是若参加运算的两个二进位同号,则结果为0(假):异号则为1(真).即0∧0=0,0∧1=1,1∧1=0 ...

最新文章

  1. JAVA产生加密公钥私钥_Java生成非对称型加密的公钥和私钥
  2. 归并排序的基本原理及实现
  3. 物料凭证不产生会计凭证的几种情况
  4. POJ3348 Cows【凸包+多边形求面积】
  5. 重做LVM文件系统之减小PV
  6. 201503-2-数字排序
  7. Impala 源码分析-FE
  8. Windows7包含哪些版本
  9. 计算方法--解线性方程组的直接法
  10. pytorch——weights_init(m)
  11. Docker hub Habor
  12. 每日计划(2)——大二
  13. Redhat镜像-RHEL-官方镜像下载大全
  14. android 内功修炼参考
  15. 微信小程序开发之——云开发初探
  16. SOC环境中挂载C和S家VIP时,解决UVM uvm_pkg冲突问题
  17. Edge下载pdf而不是在线打开
  18. 如何获取元素的相对于屏幕的距离?
  19. w5100与php通信,arduino w5100网络模块双向通信
  20. 航空客运系统代码-课程设计(C语言)

热门文章

  1. linux重启nginx命令
  2. Java实现斐波那契数列与黄金分割比精确位数问题
  3. JAVA学习必须掌握的框架,不看后悔
  4. java三个框架该先学哪个_Java常用框架有哪些?先学哪一个比较有优势?
  5. win10环境下Git安装教程
  6. 使用 HTML、CSS 和 JS 创建响应式可过滤的游戏+工具展示页面
  7. Mac M1 安装Java 开发环境(极其简单的操作)
  8. 无法保存关闭文件 苹果电脑 显示正在保存_技巧精华第5期,带你了解DXF文件、Shift键、SHX形文件、工作空间...
  9. Linux 解压文件夹下所有压缩包
  10. 仿猎豹垃圾清理(实现原理+源码)