学习过c/c++的程序员知道,在一开始就要对它的基本数据类型了如指掌。像int, unsigned int, long, unsigned long。。。。。。目的就是明白我们可以用哪些数据类型来表现我们的算法。就是因为太基础了,所以有时候却不免在细节上忽略了它们的特点,造成了比较隐秘的错误。
就以最熟悉的int和unsigned int来说明这个情况。在x86平台上s32表示是一个带符号的32位整数,u32表示的是一个无符号的32位整数。所以它们的区别在于能够表示的数的范围不同:前者能够表示负整数,而后者只能表示非负整数。
现在有这么一个函数:
void func1( unsigned int startPos, unsigned int Len, void* data );
它的作用是以data为基地址,向后偏移startPos单位开始的Len个单位的数据发送到目标。在这里,假设目标是个库函数,并且它能够接受的数据是有限的,大小为0xffff。根据要求,func1可能的实现是:
{
assert( startPos >= 0 );
assert( startPos + Len < 0xffff );
libFunc( startPos, Len, data);
}
以上的代码先是根据要求,简单的用assert()来对参数进行检查,然后就发送给库函数。这是一般的做法,但是这些代码存在一些不足,在某些情况下会导致程序不能正常运行。
1.