为什么printf显示unsigned int的负值?

Jun*_*aid 1 c linux system-calls linux-kernel

可能重复:
带有负值的无符号长整数

我编写了一个内核模块,它可以中断任何系统调用,打印其当前的user_id和传递给系统调用函数的输入参数.其中一个是sys_ioctl(),如下所示:

asmlinkage long sys_ioctl(unsigned int fd, unsigned int cmd,unsigned long arg);
Run Code Online (Sandbox Code Playgroud)

这意味着所有输入参数都是无符号的int数.

但是当我打印输入参数时,我得到以下输出:

 fd=21, cmd=-1072143871 and arg=3202983648 
 fd=21, cmd=-1072143871 and arg=3202983648 
 fd=21, cmd=-1072143871 and arg=3202983648 
 ----------
Run Code Online (Sandbox Code Playgroud)

这是我的函数定义:

asmlinkage long our_sys_ioctl(unsigned int fd ,  unsigned int cmd , unsigned long arg)
{
    uid_t gtuid ;
    gtuid = getuid_call();
    printk ("our_sys_ioctl ---> uid = %d with fd=%i, cmd=%i and arg=%lu \n ", gtuid, fd, cmd, arg);
    return original_call_ioctl(fd , cmd , arg);
}
Run Code Online (Sandbox Code Playgroud)

知道为什么cmd值是负数,这些值是什么意思?

Kar*_*k T 5

当您使用%i打印时,cmd 您正在将其投射到signed int @Mario之前猜到的那样.这就是为什么它是消极的.

您需要使用它%u来进行打印才能保持打印状态unsigned int

d或i - 有符号十进制整数

u - 无符号十进制整数

(来自:http://www.cplusplus.com/reference/cstdio/printf/)

这将按照您的预期工作.

printk ("our_sys_ioctl ---> uid = %d with fd=%i, cmd=%u and arg=%lu \n ", gtuid, fd, cmd, arg);
                                                    ^^^^
Run Code Online (Sandbox Code Playgroud)