一不小心的unsigned

在做那个网络实验课的程序时,其中有一个是编写一个16位校验和的工具,这过程中遇到了一个小小的问题,相关代码如下:

unsigned CheckSum(FILE* fp)
{
	unsigned long sum = 0;
	unsigned i = 0;
	unsigned char chStr;
    while ((chStr = fgetc(fp)) != EOF)
    {
        if(i&1)
            sum += (unsigned long)chStr;
        else
            sum += (unsigned long)chStr<<8;
        if(sum >> 16)   
        {
            sum++;
            sum &= 0xffff;
        }
		i++;
    }
    return sum;
}

但执行这个函数的时候,while循环无法退出,检查代码发现问题出在下面这一句:

unsigned char chStr;

忘记了把chStr定义为了unsigned,fopen返回EOF(-1)时,chStr成了255,这样的话就死循环了

原因已经找到,改就不难拉,修改后代码:

unsigned CheckSum(FILE* fp)
{
	unsigned long sum = 0;
	unsigned i = 0;
	char chStr;
    while ((chStr = fgetc(fp)) != EOF)
    {
        if(i&1)
            sum += (unsigned long)chStr;
        else
            sum += (unsigned long)chStr<<8;
        if(sum >> 16)   
        {
            sum++;
            sum &= 0xffff;
        }
		i++;
    }
    return sum;
}

这样一来,不仅解决了问题,而已我觉得,char类型比unsigned char类型更为合理,因为文件的内容也可能是二进制的,那如果用unsigned char时文件内容出现了非负值还是一样会出错的。

你可能感兴趣的:(一不小心的unsigned)