搜索
bottom↓
回复: 13

单片机玩了很长时间,你可能真不知道247和-9在单片机区别

[复制链接]

出0入0汤圆

发表于 2013-4-4 23:54:42 | 显示全部楼层 |阅读模式
单片机玩了很长时间,你可能真不知道247和-9在单片机区别  unsigned char 247    char -9   他们的存储值都为0xF7 仿真编译确实如此  
F7+F7=1EE           247 (F7) +247 (F7) =494(1EE) -9 (F7) +247 (F7) =238(EE)    这个真是巧合? 自然界真神奇
   下面的编译汇编一致 不知道单片机是怎么处理这个结果的。
  1. void main()
  2.         {
  3.        idata unsigned char a=247;
  4.       idata unsigned char b=247;
  5.       idata unsigned int c=0;

  6.        c=a+b;
  7. }
复制代码
  1. void main()
  2. {
  3. idata unsigned char a=247;
  4. idata  char b=-9;
  5. idata unsigned int c=0;

  6. c=a+b;
  7. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2013-4-5 00:02:31 | 显示全部楼层
计算机基础课没学好,最基本的数制码制知识,翻开书看看什么是补码。
如果基础不过关,很难有提高的

出105入79汤圆

发表于 2013-4-5 01:14:38 | 显示全部楼层
哎,谁不知道啊,数据类型,补码都是基本知识啊。

出0入0汤圆

 楼主| 发表于 2013-4-5 10:29:40 | 显示全部楼层
learner123 发表于 2013-4-5 00:02
计算机基础课没学好,最基本的数制码制知识,翻开书看看什么是补码。
如果基础不过关,很难有提高的 ...

这个知道,我问任何一个学计算机的,他们都不知道底层(单片机 计算机)如果区分F7到底是247 还是-9

出0入0汤圆

 楼主| 发表于 2013-4-5 10:30:58 | 显示全部楼层
qwe2231695 发表于 2013-4-5 01:14
哎,谁不知道啊,数据类型,补码都是基本知识啊。

这个知道,我问任何一个学计算机的,他们都不知道底层(单片机 计算机)如果区分F7到底是247 还是-9   补码谁都会计算,做题目,虽然不用管,编译器会解决,但是要明白汇编如何处理数据类型的。要迟到 unsigned char char 都占几个字节?

出0入17汤圆

发表于 2013-4-5 10:35:27 | 显示全部楼层
区分是因为这个代码是你写的,所以你知道它代表什么;
计算机是不区分的

出0入17汤圆

发表于 2013-4-5 10:38:38 | 显示全部楼层
利用补码把加法和减法合并这是前辈天才的想法

出0入0汤圆

 楼主| 发表于 2013-4-5 10:45:09 | 显示全部楼层
hhxb 发表于 2013-4-5 10:38
利用补码把加法和减法合并这是前辈天才的想法

了解 看编译器的结果: 如果我们自己写汇编,我们需要人为知道F7此时代表的是247 还是-9,相加减时要做出处理。
F7+F7=1EE           247 (F7) +247 (F7) =494(1EE)             -9 (F7) +247 (F7) =238(EE) 人为的需要确定是不是需要舍去进位1。

那如果写C编译器会这样处理,如果两者只是赋值不计算 其实ram里面都是一样的F7,如果计算,编译器会加上处理的。那个想法确实天才不可思议

出0入4汤圆

发表于 2013-4-5 11:04:33 | 显示全部楼层
也不是天才吧。生活中很多例子的。最简单的就是时钟吧。讲补码的时候就是以时钟为例的,不过貌似现在有指针的时钟也不多了

出0入0汤圆

发表于 2013-4-6 13:01:28 | 显示全部楼层
本帖最后由 barryliu 于 2013-4-6 13:12 编辑

楼主的问题出在这里:

01.void main()

02.        {

03.       idata unsigned char a=247;

04.      idata unsigned char b=247;

05.      idata unsigned int c=0;

06.

07.       c=a+b;

08.}

找本C语言书了解一下类型转换的部分。
-9与247只有在单字节时才是相等的,在2字节时是不相等的。而你的变量c定义的是uint,你运算式里对应-9常数是ff f7,不是00 f7,而你的程序里,运行到这一步时,你以为的"-9"显然是00 f7,也就是+247,所以。。。

你把c改回uchar,结果就是你预期的了。

出0入0汤圆

发表于 2013-4-6 13:06:13 | 显示全部楼层
楼上正解。。。。。。

出0入0汤圆

发表于 2013-4-6 13:34:03 来自手机 | 显示全部楼层
大一的知识

出0入134汤圆

发表于 2013-4-6 13:46:34 | 显示全部楼层
任何数据在编译的时候都要能确定它的数据类型,不然这个数就是无意义的,就像LZ所说的这个问题。

出0入0汤圆

发表于 2013-4-6 16:00:04 | 显示全部楼层
楼主说的没错
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 12:48

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表