unsigned int
unsigned int
: 无符号数,0~2^n - 1。遇到负数,则以补码形式存储。
(signed) int
: 有符号数,-2^(n-1)~2^(n-1) - 1
简单的循环问题
void main()
{
signed int i; //有符号数
for(i=-10;i<0;i++)
{
...
}
}
此处的i<0.
void main()
{
unsigned int i; //无符号数,此处将i初始化为负数,以补码形式存储,在计算机中是一个很大的数
for(i=-10;i>0;i++)
{
...
}
}
此处的i>0.
溢出问题
/* Kernel memory region holding user-accessible data */
#define KSIZE 1024
char kbuf[KSIZE];
/* Copy at most maxlen bytes from kernel region to user buffer */
int copy_from_kernel(void *user_dest, int maxlen) {
/* Byte count len is minimum of buffer size and maxlen */
int len = KSIZE < maxlen ? KSIZE : maxlen;
memcpy(user_dest, kbuf, len);
return len;
}
此处的len选择 KSIZE
与maxlen
中长度较短的。
但是如果此时maxlen
为负数,以补码形式存储,即为一个很大的数。
再结合memcpy
会造成缓冲区溢出。