STC15 signed long 转换为字符串输出最小负数-2147483648 为 -0 的Bug

出错代码

void SendLong(long dat)
{
    char flg              = 0; //标记正负
    unsigned char buf[10] = 0; //0xFFFFFFFF有10bit
    char i                = 0;
    SendString("\r\n");

    //处理负数
    if (dat < 0)
    {
        flg = 1;
        dat = -dat;
    }
    else
    {
        flg = 0;
    }

    //从个位开始提取字符
    while (dat >= 10)
    {
        buf[i++] = (dat % 10 + 48);
        dat = dat / 10;
    }

    //取最高位
    buf[i] = dat + 48;

    //发送
    if ((flg == 1))
    {
        SendData('-');
    }
    while (i >= 0)
    {
        SendData(buf[i--]);
    }
}

以上内容之所以产生 dat = -2147483648时,输出 -0 的bug因为正数的最大值为2147483647,dat取反之后对应的值是 0。

解决方法
重新改变 dat的类型为 unsigned long 这样取反的结果中就存在2147483648
这样当dat=-2147483648时,就可以得到对应的正数值2147483648

解决结果
正常输出-2147483648
在这里插入图片描述

正确代码

void SendSignedLong(signed long dat1)
{
    unsigned long dat;
    bit  flgMinus                  = NO;         /*标记dat的正负 flgMinus = OK 是负数,反之为正数*/
    char i                         = 0;
    unsigned char ArrBufInlong[11] = 0;          /*存放long的每一位*/

    /*判断dat的正负*/
    if (dat1 < 0)
    {
        flgMinus = OK;
        dat = -dat1;
    }
    else
    {
         dat = dat1;
         flgMinus = NO;
    }


    /*从个位开始提取字符*/
    while (dat >= 10)
    {
        ArrBufInlong[i++] = (dat % 10 + '0');
        dat = dat / 10;
    }

    /*提取最高位*/
    ArrBufInlong[i] = dat + '0';

    /*是负数添加 '-'*/
    if(flgMinus == OK)
    {
        ArrBufInlong[++i] = '-';
    }

    /*等待上一帧数据发送完成*/
    while (SendFinishFlag == SendFinishFlagON );

    /*等待上一个字符发送完成*/
    while(busy == 1);

    /*赋值要发送的位数*/
    SendBufIndex = i;

    /*发送long数据*/
    for( ;i >= 0;i--)
    {
         SendBuf[i] = ArrBufInlong[i];
    }
        /*发送第一位的数据*/
        SBUF = SendBuf[SendBufIndex--];

        /*标志正在发送*/
        SendFinishFlag = SendFinishFlagON;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值