【c语言】【visual studio】带你一步一步轻松了解 int 类型以%f输出,char 类型以 %d输出,float类型以%d输出等等是如何输出的。

引言:看本文章之前,还需了解数据在内存中的是以二进制的补码存储的,以及整型和浮点型的存储方式的不同。(具体可看这篇博客)

   【c语言】【visual studio】带你了解浮点型和整型在内存中的储存方式。-CSDN博客

规则:

数据存储拿取步骤(以x86环境为例)存a
存储
1.先都是32位二进制存储。——按存储规则存储。
拿出
2.看放置类型,若是char类型只拿低位8位,若是short 只拿低位16.放到类型中——看放置类型,拿取低位位数
提升
3.整型提升提升为32位。提升原则:看a的类型是什么,有符号高位添加符号位至32位,无符号高位添加0至32位。——看放置类型,整型提升
打印
4.看以什么格式输出。例如我以%d的格式(有符号整型)数据在内存中是补码存储,打印是原码。所以要换成原码。符号位不变,-1,按位取反,得到原码。最后输出。——看输出类型,打印数据。

1.float如何以%d输出

我们以代码举例

#include 
int main()
{
	int n = 9;
	float *pa = &n;
	*pa = 2.5;
	printf("%d ", n);
	printf("%f ", *pa);
	return 0;
}

结果输出:

【c语言】【visual studio】带你一步一步轻松了解 int 类型以%f输出,char 类型以 %d输出,float类型以%d输出等等是如何输出的。_第1张图片

注:这里我为什么这么写,而不是直接用float类型,用float类型变量这里就设计double提升的概念了,我们这里主要探讨的是浮点型存储的数以%d输出,这样写才满足我们探讨的要求。

结果为什么结果这么奇怪呢?

我们按照我们的规则算一遍:
【c语言】【visual studio】带你一步一步轻松了解 int 类型以%f输出,char 类型以 %d输出,float类型以%d输出等等是如何输出的。_第2张图片

2.字符型以%d打印又是怎么样的呢?

我们接着看这样一个代码:

#include 
int main()
{
	unsigned char a = -1;
	printf("%d", a);
	return 0;
}

结果输出:

【c语言】【visual studio】带你一步一步轻松了解 int 类型以%f输出,char 类型以 %d输出,float类型以%d输出等等是如何输出的。_第3张图片

同样我们算一遍:
【c语言】【visual studio】带你一步一步轻松了解 int 类型以%f输出,char 类型以 %d输出,float类型以%d输出等等是如何输出的。_第4张图片

3.那我们int类型以%f输出呢?

我们接着看:

#include 
int main()
{
	int a = 5;
	printf("%f", a);
	return 0;
}


输出结果为:

【c语言】【visual studio】带你一步一步轻松了解 int 类型以%f输出,char 类型以 %d输出,float类型以%d输出等等是如何输出的。_第5张图片

同样我们算一遍:
【c语言】【visual studio】带你一步一步轻松了解 int 类型以%f输出,char 类型以 %d输出,float类型以%d输出等等是如何输出的。_第6张图片

总结,做完这些例题后,我们不难发现步骤其实很简单:

1.数据存储。

2.看要变量类型,决定怎么拿bit位,以及要不要整型提升。

3.看打印类型,决定这是什么类型的变量,再以次类型的转化原则转化,再打印。

实际上就是一个数据在两种类型下理解的不同,所以结果就有所不同而已。

你可能感兴趣的:(c语言,visual,studio,开发语言)