union
{ unsigned char byte[4];
unsigned long L32;//[trainID_LENGTH];
}value;
unsigned char buffer[5];
unsigned char number[11];//[5];
unsigned char temp;
// value.L32=0x1131A3b0;
value.byte[3]=g_ucTempbuf[0];//.L32
value.byte[2]=g_ucTempbuf[1];//.L32
value.byte[1]=g_ucTempbuf[2];//.L32
value.byte[0]=g_ucTempbuf[3];//.L32
//一共10位数
// if(value!=0x1131A3b0){value=999999;}; //debug
buffer[4]=value.L32/100000000;
buffer[3]=value.L32%100000000/1000000;
buffer[2]=value.L32%1000000 /10000;
buffer[1]=value.L32%10000 /100;
buffer[0]=value.L32%100;// /10000;
就是这样一段代码,如果直接用常规写法就会在0x00010000这一位和0x00001000这一位出错
出错情况就是这上面为1的位是1或者是0的时候,算出来是不对的.
常规写法就是
unsigned long L32;
unsigned g_ucTempbuf[4];
unsigned char buf[5];
L32=g_ucTempbuf[0]*0x01000000
+g_ucTempbuf[1]*0x010000
+g_ucTempbuf[2]*0x0100
+g_ucTempbuf[3];
buffer[4]=value.L32/100000000;
buffer[3]=value.L32%100000000/1000000;
buffer[2]=value.L32%1000000 /10000;
buffer[1]=value.L32%10000 /100;
buffer[0]=value.L32%100;// /10000;
问题应该在乘法进位上,,我跟踪断点到乘法完成时候看值就是不对了一个bit,(我标注//debug的地方就是断点处,也是判断异常的一个分支)
|