unsigned int 与 signed int

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选择 KSIZEmaxlen中长度较短的。

但是如果此时maxlen负数,以补码形式存储,即为一个很大的数。

再结合memcpy会造成缓冲区溢出。