C语言中带环绕的8位校验和

C语言中带环绕的8位校验和,c,networking,checksum,C,Networking,Checksum,我已经做了一个8位校验和函数,但是和没有被包围,我的意思是,左边的溢出带不会被加回到右边。我怎样才能做到这一点 unsigned char checksum(unsigned char message[], int nBytes) { unsigned char sum = 0; while (nBytes-- > 0) { sum += *(message++); } return (~sum); } 例如,当添加两个字节时

我已经做了一个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)

这是一个不寻常的要求,但应该做到这一点(没有关于效率的声明):


由于通常的算术转换,算术和比较是使用
int
完成的。

“左侧的溢出进位不会添加到右侧”
这不是溢出或换位通常的工作方式。校验和的计算通常忽略进位/溢出。您确定要将溢出添加回产品中吗?我同时控制发送方和接收方,以便解决问题。我只是在遵循一个规范,但很高兴知道标准是什么,以备将来注意,谢谢:)对于单词“sugar”,我通过查看一个ASCII表格计算:,115+117+103+97+114,其中1的进位导致中间和232,然后是335+1433+1548+1=549 final,这比仅仅求和546大3。因此,当小计超过可能的8位表示形式时,您将添加1,但我似乎应该添加256。读取无符号是0到255,有符号是-127到127。无符号8位
char
的范围是0..255。有符号8位
char
的范围取决于有符号和大小、一个补码还是两个补码算法。对于一的补码、符号和大小,零有两种表示(正和负),范围实际上是-127到+127。对于二的补码,在-128到+127的范围内存在不对称性(零有一种表示)。你不太可能遇到一台不使用二的补码运算的机器。
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);
}