c/c++语言开发共享为什么printf显示unsigned int的负值?


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

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

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

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

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

  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值是负数以及这些值是什么意思?

    当您使用%i打印cmd 您将其转换为@Mario以前猜到的signed int 。 这就是为什么它是消极的。

    您需要使用%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); ^^^^ 

    使用%i打印,将参数转换为signed int。 用%u打印。

      以上就是c/c++开发分享为什么printf显示unsigned int的负值?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/523008.html

      (0)
      上一篇 2020年12月11日
      下一篇 2020年12月11日

      精彩推荐