澄清C程序中的各种格式说明符

时间:2018-11-13 13:15:57

标签: c size format-specifiers

我不了解%p%u%x%d之间的主要区别是什么,除了%x显示十六进制{{1} }用于无符号整数,而%u用于任何整数。在我接受一个整数变量并分别打印其地址和值(正整数)之后,我感到非常困惑,然后无论我使用哪种格式说明符,它都能正确打印输出(十六进制和十进制数字系统的差异除外) )。那么主要区别是什么?

如果差异不大,那么哪种格式说明符更适合打印什么类型的变量?

另一个疑问是:是否所有多重性的指针(我的意思是%d int *p; int **p;等)都占据相同的大小(即在其中存储有效地址所需的大小)机器)?如果不是,那么这些指针的大小是多少?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

%u%x%d%p格式说明符的使用方式如下:

  • %u:需要一个unsigned int作为参数,并以十进制格式打印。
  • %x:需要一个unsigned int作为参数,并以十六进制格式打印。
  • %d:需要一个int作为参数,并以十进制格式打印。
  • %p:期望将void *作为参数并以实现定义的方式打印(通常为十六进制数)

另外,%u%x%d可以加上长度修饰符作为前缀:

  • l:表示long intunsigned long int
  • ll:表示long long intunsigned long long int
  • h:表示short intunsigned short int
  • hh:表示signed charunsigned char

关于指针大小,int *int **int ***等不必具有相同的大小,尽管在大多数实现中它们都将是相同的。

答案 1 :(得分:0)

使用格式说明符,您可以告诉计算机如何解释给定的变量/数据。

快速演示:

#include <stdio.h>

int main(void)
{
    int x = -5;
    printf("x value as int: [%d]\n", x);
    printf("x value as unsigned int: [%u]\n", x);
    printf("x value as hexadecimal: [%x]\n", x);
    printf("x value as pointer: [%p]\n", x);

    return 0;
}

输出:

x value as int: [-5]
x value as unsigned int: [4294967291]
x value as hexadecimal: [fffffffb]
x value as pointer: [0xfffffffb]

它是每次给出的相同值,即x = -5

  • 当使用正确的格式说明符(第一种情况)时,我们会看到确切的表示形式。

  • 在第二种情况下,我们看到了一个很大的数字。 “为什么”的答案在这里需要解释很长,但是您应该查看2的补码系统中负整数的表示方式。

  • 在第三种情况下,我们看到数字4294967291的十六进制表示形式。十六进制数字通常以0x开头,但是%x则不这样做。

  • 最后一个只是显示变量x是内存中的地址时的样子,当然也是十六进制格式。