一不小心的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时文件内容出现了非负值还是一样会出错的。
浙公网安备 33010602011771号