【问题标题】:printf formatting (%d versus %u)printf 格式(%d 与 %u)
【发布时间】:2010-11-12 12:26:52
【问题描述】:

打印指针地址时%d%u有什么区别?

例如:

int a = 5;
// check the memory address
printf("memory address = %d\n", &a); // prints "memory address = -12"
printf("memory address = %u\n", &a); // prints "memory address = 65456"

【问题讨论】:

  • 拜托!整理一下,把你的代码放在代码块中(缩进4个空格),然后用可以回答的方式问你的问题!
  • 有人明白他的意思吗?如果是这样,请总结一下,这似乎是一个很简单的问题,我就是无法理解。
  • 我尽我所能在不“破坏”原始信息的情况下表达清楚。
  • 如果您希望自己的问题得到解答,请花 30 多秒的时间来写。使用正确的拼写、大写、标点和结构。
  • 可能英语不是他的母语,所以很难很好地交流。

标签: c pointers formatting printf


【解决方案1】:

您可以在this page 上找到格式转义列表。

%d 是有符号整数,而%u 是无符号整数。指针(当被视为数字时)通常是非负的。

如果您确实想要显示指针,请使用%p 格式说明符。

【讨论】:

  • 有趣的是,他的示例显示的是负值!这取决于机器,但我想说的是,在 32 位机器上,带前导一位的地址相当普遍,但在 64 位机器上则较少。
【解决方案2】:

如果我正确理解您的问题,您需要%p 来显示指针正在使用的地址,例如:

int main() {
    int a = 5;
    int *p = &a;
    printf("%d, %u, %p", p, p, p);

    return 0;
}

将输出如下内容:

-1083791044, 3211176252, 0xbf66a93c

【讨论】:

    【解决方案3】:

    %u 用于无符号整数。由于有符号整数地址操作符 %d 给出的内存地址是 -12,为了得到这个无符号整数值,Compiler 返回这个地址的无符号整数值。

    【讨论】:

      【解决方案4】:

      %u 打印无符号整数

      %d 打印有符号整数

      要获取指针地址,请使用 %p

      其他格式转义列表:

      这里是格式转义的完整列表。我只是提供this page的屏幕截图

      【讨论】:

        【解决方案5】:

        区别很简单:编译时会发出不同的警告信息:

        1156942.c:7:31: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
             printf("memory address = %d\n", &a); // prints "memory add=-12"
                                       ^
        1156942.c:8:31: warning: format ‘%u’ expects argument of type ‘unsigned int’, but argument 2 has type ‘int *’ [-Wformat=]
             printf("memory address = %u\n", &a); // prints "memory add=65456"
                                       ^
        

        如果您将指针作为void* 传递并使用%p 作为转换说明符,则不会收到错误消息:

        #include <stdio.h>
        
        int main()
        {
            int a = 5;
            // check the memory address
            printf("memory address = %d\n", &a); /* wrong */
            printf("memory address = %u\n", &a); /* wrong */
            printf("memory address = %p\n", (void*)&a); /* right */
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-31
          • 1970-01-01
          • 2017-02-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多