永远的溢出
运算溢出
溢出是一个永恒的话题。
int a = 0xf000;
int b = 0xff000;
long c = a * b;
此时c = -251658240,以为已经使用了long类型来存储结果,但是计算过程中就已经溢出了。应该在计算时就预先进行类型转换:
long c = (long)a * (long)b;
类型间比较
unsigned int MAX_LEN = 1024;
void* alloc_memory(int mem_size) {
if (mem_size >= MAX_LEN) {
return NULL;
}
return malloc(mem_size);
}
由于和unsigned类型比较,当mem_size为负数时,其实转换到unsigned是一个非常大的数,所以可以通过第一个检查,然后使用malloc时会分配一块巨大的内存。