打印

各位老大帮忙看一下,负数的问题

[复制链接]
3682|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kunzicool|  楼主 | 2007-9-20 11:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位老大在单片机里如何表示负数,例如0fb在算数运算时我理解应该是-5
但我用30h-0fb 用keil仿真,显示确是需要向cy位借位,需要各位老大解惑!
先谢谢各位了!

相关帖子

沙发
kunzicool|  楼主 | 2007-9-20 11:29 | 只看该作者

各位老大帮忙解释一下,还是转不过来这个弯!

使用特权

评论回复
板凳
ayb_ice| | 2007-9-20 11:32 | 只看该作者

一般用补码表示...

使用特权

评论回复
地板
HWM| | 2007-9-20 11:35 | 只看该作者

LZ:指令不认符号

在此FBh就是251。

使用特权

评论回复
5
kunzicool|  楼主 | 2007-9-20 11:37 | 只看该作者

to aybice

ayb_ice : 您好
是需要 把负数先换成相应的补码在让其参与运算吗?


ayb_ice 发表于 2007-9-20 11:32 侃单片机 ←返回版面    

3楼: 一般用补码表示... 

使用特权

评论回复
6
kunzicool|  楼主 | 2007-9-20 11:40 | 只看该作者

to HWM

那应该怎样操作 带负数的运算啊



HWM 发表于 2007-9-20 11:35 侃单片机 ←返回版面    

4楼: LZ:指令不认符号 

在此FBh就是251。
 
 

使用特权

评论回复
7
HWM| | 2007-9-20 11:45 | 只看该作者

别去管进位或借位。

如果你把八位数视为带符号的数,就采用你所知的方法去处理。

就是 30-FBh -> 35h

使用特权

评论回复
8
onemillion| | 2007-9-20 12:18 | 只看该作者

先分析清楚功能要求,

 能不用负的就尽量别用, 
搞了这么多年的程序,都从来没用过负数,
一直都是 unsigned ,
用无符号正数安全点,

使用特权

评论回复
9
HWM| | 2007-9-20 12:22 | 只看该作者

8楼:负数没那么可怕,亏你还“搞了这么多年的程序”。

使用特权

评论回复
10
onemillion| | 2007-9-20 12:35 | 只看该作者

哈,9楼别笑话偶

  本人做程序半路出家,刚开始学习的时候条件不好,不象现在的书本,板子满天飞,而且便宜。
 只能啃书本,拿着本谭浩强的书还有一本8088的汇编程序的书,**语言关键字和编程规范,那时看到负数和浮点数的表示法就傻了,觉得很复杂,导致我以后写程序的时候都是用无符号的正数的,
 应用中,尽量避免复杂的运算,
用汇编进行运算的时候,用无符号的正数实现多字节的加减乘除也完成可以。

使用特权

评论回复
11
kunzicool|  楼主 | 2007-9-20 12:40 | 只看该作者

谢谢 HWM

谢谢 HWM
我是做一个测温的程序,最低温度是-45摄氏度,如果低于-20度则要有一个动作,我是想用我所采集的实际温度比如 -18度,减去我的设定温度即-20度,然后去判断cy如果为0则不需要动作,如果实际采集的温度为-21则做减法cy应该置1,接着就要有动作。看来我的这个思路行不通了,我再想想!再次谢谢HWM

使用特权

评论回复
12
HWM| | 2007-9-20 12:42 | 只看该作者

基础很重要,否则会闹笑话。

“用汇编进行运算的时候,用无符号的正数实现多字节的加减乘除也完成可以”

03h - 05h -> 0FEh ???

使用特权

评论回复
13
kunzicool|  楼主 | 2007-9-20 13:01 | 只看该作者

谢谢 onemillion

使用特权

评论回复
14
onemillion| | 2007-9-20 13:18 | 只看该作者

哈 HWM

对于 03h - 05h -> 0FEh ???
     A   - B   -> C
1: 先要定义个符号变量flag,=0结果为正,=1结果为负
    unsigned char A,B,C,flag;

     if (A>B)      // 判断被减数A,和减数B的大小,
     {
        C = A-B;   // A > B
        flag=0;
     } else
     {
        C = B - A;  // B>A
        flag=1;
     }
    
对于结果的正负,通过flag软件识别,虽然程序罗嗦一点,但是,看上去直观。 而不要将数据定义为有符号数了,

使用特权

评论回复
15
HWM| | 2007-9-20 13:21 | 只看该作者

LS:你很有“空”的。

使用特权

评论回复
16
onemillion| | 2007-9-20 13:46 | 只看该作者

晕,楼主

最低温度是-45摄氏度,如果低于-20度则要有一个动作,我是想用我所采集的实际温度比如 -18度,减去我的设定温度即-20度,然后去判断cy如果为0则不需要动作,如果实际采集的温度为-21则做减法cy应该置1,接着就要有动作。看来我的这个思路行不通了,我再想想!

------------------------------------------------------------------
楼主你的数据是怎么读来的,比如-18,你是怎么读来的
即便是-18,那么你在程序里面是是怎么表示的呢?

对于你说的情况,完全可以不用负数,直接将符号全部去掉
参考代码如下


   mov  r4, #20   ;; 设定的-20度
   mov  r5, #18   ;; -18度
   mov  r6, #21   ;; -21度

   mov  a,  r4
   clc  c         
   sub  a,  r5    ;; a=a-r5-0 = 20-18= 2       -->cy=0
  ;; sub  a,  r6    ;; a= a-r6-0 = 20 - 21 = 255  -->cy=1

   jc   wen_du_di  ;; 
   jmp  wen_du_gao 

wen_du_di:   ;;温度低于-20
   ;; 处理程序

wen_du_gao:  ;;温度高于-20
   ;; 处理程序

使用特权

评论回复
17
kunzicool|  楼主 | 2007-9-20 17:41 | 只看该作者

谢谢 onemillion

非常感谢 onemillion  有点理解您的意思了 ,谢谢您

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

39

帖子

1

粉丝