我不了解%p
,%u
,%x
,%d
之间的主要区别是什么,除了%x
显示十六进制{{1} }用于无符号整数,而%u
用于任何整数。在我接受一个整数变量并分别打印其地址和值(正整数)之后,我感到非常困惑,然后无论我使用哪种格式说明符,它都能正确打印输出(十六进制和十进制数字系统的差异除外) )。那么主要区别是什么?
如果差异不大,那么哪种格式说明符更适合打印什么类型的变量?
另一个疑问是:是否所有多重性的指针(我的意思是%d
int *p;
int **p;
等)都占据相同的大小(即在其中存储有效地址所需的大小)机器)?如果不是,那么这些指针的大小是多少?
感谢您的帮助。
答案 0 :(得分:2)
%u
,%x
,%d
和%p
格式说明符的使用方式如下:
%u
:需要一个unsigned int
作为参数,并以十进制格式打印。%x
:需要一个unsigned int
作为参数,并以十六进制格式打印。%d
:需要一个int
作为参数,并以十进制格式打印。%p
:期望将void *
作为参数并以实现定义的方式打印(通常为十六进制数)另外,%u
,%x
,%d
可以加上长度修饰符作为前缀:
l
:表示long int
或unsigned long int
ll
:表示long long int
或unsigned long long int
h
:表示short int
或unsigned short int
hh
:表示signed char
或unsigned 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
是内存中的地址时的样子,当然也是十六进制格式。