我已经制作了一个8位校验和功能,但总和并没有回旋,我的意思是左边的溢出不会再添加到右边。我怎样才能做到这一点?
unsigned char checksum(unsigned char message[], int nBytes)
{
unsigned char sum = 0;
while (nBytes-- > 0)
{
sum += *(message++);
}
return (~sum);
}
例如,当添加两个字节时,这就是我想要实现的一种环绕:
1001 1100
+1100 0010
------------
0101 1111 (sum)
1010 0000 Checksum (1's complement)
答案 0 :(得分:2)
这是一个不寻常的要求,但这应该可以解决问题(没有提出效率要求):
unsigned char checksum(unsigned char message[], int nBytes)
{
unsigned char sum = 0;
while (nBytes-- > 0)
{
int carry = (sum + *message > 255) ? 1 : 0;
sum += *(message++) + carry;
}
return (~sum);
}
算术和比较是使用int
完成的,因为通常的算术转换。