- unsigned short re = 0;
- for(int i = 0; i < 10; i++)
- re += ~a[i];
- re = ~re;
然后我又做了如下的程序:
- unsigned short re = 0;
- for(int i = 0; i < 10; i++)
- re += a[i];
- re = ~re;
再然后,看了资料,做了如下改进:
- int sum = 0;
- unsigned short result = 0;
- for(int i = 0; i < 10; i++)
- {
- sum += a[i];
- sum = sum % 65535;
- }
- result = (unsigned short)sum;
- result = ~result;
这次,result的结果是0xffff,全1,说明校验和正确了。
原来,这个反码的十进制算法是基于(2的n次方-1)的,就是说,16位的反码算术是65536-1= 65535的(65536是2的16次方),那么以上的过程就是“先求部分和,再求其反码”,或者反过来理解“先求和的反码,再求和”,简称就是反码求和了。
而上面第二个程序是unsinged short 的加法运算,默认是模65536的,所以不正确。
至于第一个程序,是我理解有误的原因,语文和英文学不好的后果,汗,所以要学好语文和英文哦。