出错代码
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;
}