查看: 3165|回复: 2

哪位大侠帮帮我?MCS08AW16牵制类型转换的问题

[复制链接]

该用户从未签到

3

主题

10

帖子

0

新手上路

Rank: 1

积分
48
最后登录
1970-1-1
发表于 2009-11-9 11:02:03 | 显示全部楼层 |阅读模式
 
I_ad = ( int16_t )( ATD_Value[0] - ATD_Value[1] );
I_ad是有signed Int,有符号16位
ATD_Value[x]是unsigned char,无符号8位
typedef  signed int  int16_t;
ATD_Value[0] - ATD_Value[1]的差值为0或-1,BDM观察强制转换的过程中0用-256表示,
-1用255表示,是代码的问题?还是编译器优化的问题?
附Codewarrior反汇编出的代码
LDA   ATD_Value:1
PSHA  
LDA   ATD_Value
TSX   
SUB   ,X
STA   ,X
CLRA  
SBC   #0
PSHA  
PULH  
PULX  
STHX  I_ad
求高手解答,不胜感激!
回复

使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2009-11-10 10:20:40 | 显示全部楼层

    回复:哪位大侠帮帮我?MCS08AW16牵制类型转换的问题

    不是代码问题,是你的定义类型不一样的事情。256=0,是正确的。8位-8位,怎么会出来大于255的数呢?
    建议使用代码:
    unsigned char num;

    if(ATD_Value[0]
    该会员没有填写今日想说内容.

    该用户从未签到

    3

    主题

    10

    帖子

    0

    新手上路

    Rank: 1

    积分
    48
    最后登录
    1970-1-1
     楼主| 发表于 2009-11-11 10:16:18 | 显示全部楼层

    RE:哪位大侠帮帮我?MCS08AW16牵制类型转换的问题

    谢谢版主!
    用了您提供的方法,结果是-32768,问题出现在 I_ad=num | 0x8000;
    因工程需要I_ad范围(-80,160)不能用signed char的变量类型
    将您的代码修改为:
    unsigned char num;
    signed char temp;
    if(ATD_Value[0]  < ATD_Value[1])  {
    temp=ATD_Value[0]-ATD_Value[1];
    I_ad=temp;
    }
    else
    {
    num=ATD_Value[0]-ATD_Value[1];
    I_ad=num;
    }
    问题解决了,
    谢谢您提供的思路!

     
     
     
    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-18 14:02 , Processed in 0.081799 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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