无符号类型给有符号类型赋值符号位的问题

本文记录了一次在实现Modbus通信协议解析时遇到的CRC校验错误问题。由于将无符号short类型的CRC值赋给了有符号short类型的变量,导致数据溢出和逻辑判断错误。问题的关键在于不同类型之间的赋值可能导致数值范围的变化,尤其是涉及到有无符号位的情况。解决方案是确保变量类型一致,避免数据类型的不匹配造成的问题。此外,作者意识到在调试过程中专注的重要性。
摘要由CSDN通过智能技术生成

记一次bug

问题

再写modbus通信协议解析的时候遇到一个问题,计算CRC的时候返回值是一个unsigned short,接受的时候我定义的结构体里的CRC是一个有符号 short,也是头一次遇到有无符号位的问题。下面我把具体代码贴出来。


if(pModbusWrite->sCRC == 0x825d) //一开始提示出问题的代码

pModbusWrite->sCRC=ModBusCRC16Table(aucAnalyzBuf,7+pModbusWrite->ucByte_Number);//查表法计算CRC,
//下面可以看到返回的是unsigned short
unsigned short ModBusCRC16Table(unsigned char *puchMsg,unsigned short usDataLen)
{
    unsigned char uchCRCHi = 0xFF ; /* high byte of CRC initialized */
    unsigned char uchCRCLo = 0xFF ; /* low byte of CRC initialized */
    unsigned uIndex ;               /* will index into CRC lookup table */
    while (usDataLen--)             /* pass through message buffer */
    {
        uIndex = uchCRCLo ^ *puchMsg++ ; /* calculate the CRC */
        uchCRCLo = uchCRCHi ^ auchCRCLo[uIndex] ;
        uchCRCHi = auchCRCHi[uIndex] ;
    }
    return (uchCRCHi << 8 | uchCRCLo) ;
}

typedef struct modbus_write
{
	 unsigned char ucAddr;  
	 unsigned char ucFunction;  
	 unsigned char ucHighAddr; 
	 unsigned char ucLowAddr;
	 unsigned char ucHighNumber;  
	 unsigned char ucLowNumber; 
	 unsigned char ucByte_Number; 
	 short sCRC;       // 这里我定义的是short
}*PMODBUS_Write, MODBUS_Write;
/*把unsigned short赋值给了short*/

分析

unsigned short 0x825d 第一位是1,short的话也就是符号位为0,这样一来short的最高位也就是符号位永远不可能为1,所以提示错误,我在debug的时候看到pModbusWrite->sCRC 就是显示为0x825D但是就是进不去if里面。PS:这是求助师傅解决的,然后刚好手机来了个信息看了一眼,刚好没看到他找出来的过程,然后问我,我显然不知道为什么,然后他给我解释了一遍,让我记录一下。
以后不同变量之间赋值的时候注意尽量保持类型相同,避免出现相同的错误或者其他的错误,另外有符号的short永远比无符号的short的正数范围小因为符号位只能表示最大7位数。
最后在师傅调试的时候走神这样很不好,十分的不好。谨记!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值