为什么printf的显示负值为unsigned int类型? [重复](Why does pri

2019-10-17 13:21发布

可能重复:
无符号长与负值

我已经写了一个内核模块,它会中断任何系统调用,打印传递给系统调用函数当前USER_ID和输入参数。 其中,一个是sys_ioctl()如下:

asmlinkage long sys_ioctl(unsigned int fd, unsigned int cmd,unsigned long arg);

这意味着所有的输入参数是无符号整型数。

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

 fd=21, cmd=-1072143871 and arg=3202983648 
 fd=21, cmd=-1072143871 and arg=3202983648 
 fd=21, cmd=-1072143871 and arg=3202983648 
 ----------

这里是我的函数的定义:

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);
}

任何想法,为什么CMD值为负,并且这些值的含义?

Answer 1:

当您使用%i打印cmd 要将它强制转换为signed int作为@Mario先前猜测。 这就是为什么它是消极的。

您需要使用%u做印刷为它仍然是一个unsigned int

d或I - 符号十进制整数

ü - 无符号十进制整数

(来自: 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);
                                                    ^^^^


Answer 2:

您打印%i该将参数转换成一个符号整型。 与打印%u



文章来源: Why does printf show negative values for unsigned int? [duplicate]