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