- 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的,所以不正確。
至於第一個程序,是我理解有誤的原因,語文和英文學不好的後果,汗,所以要學好語文和英文哦。