懂视网
回答时间:2022-03-30 14:07
以C语言为例,double型用【printf的%f】输出,根据“默认参数提升”规则(在printf这样的函数的可变参数列表中,不论作用域内有没有原型,都适用这一规则)float型会被提升为double型。
c语言是一门面向过程、抽象化的通用程序设计语言,广泛应用于底层开发。C语言具有高效、灵活、功能丰富、表达力强和较高的可移植性等特点,在程序设计中备受青睐。C语言编译器普遍存在于各种不同的操作系统中,例如Microsoft Windows、macOS、Linux、Unix等。C语言的设计影响了众多后来的编程语言,例如C++、Objective-C、Java、C#等。
C语言是一门面向过程的计算机编程语言,与C++、Java等面向对象编程语言有所不同。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。C语言描述问题比汇编语言迅速,工作量小、可读性好,易于调试、修改和移植,而代码质量与汇编语言相当。C语言一般只比汇编语言代码生成的目标程序效率低10%~20%。因此,C语言可以编写系统软件。
收起
热心网友
回答时间:2022-03-30 11:15
使用printf时,它们具有相同的格式说明符,但使用scanf时,它们没有相同的格式说明符。
为什么是这样?因为printf的参数被提升,而scanf的参数(作为指针)却不被提升。
这种论点提升到底是什么?当较小尺寸的参数(特别是char,short和float)传递给可变参数函数(如printf之类的函数,其参数数量不固定)时,它们将转换为较大尺寸。Char和short转换为int,float转换为double。
为什么这样 据我所知,纯粹出于历史原因。C的设计师认为这是个好主意,因为这些转换基本上是免费的,因为所有类型的尺寸都足够小,可以放入单个寄存器或堆栈中的单个“单元”(将内容压入堆栈必须与某些字节边界对齐,例如,堆栈上的每个项目都必须以4的倍数的地址开头。同样,显然,这种转换减少了传递参数时的错误。
因此,当您向printf传递float类型的参数时,实际上它会在转换为printf之前就转换为double类型。我们可以使用调试器证明这一点。我写了下面的C代码:
主要功能编译成:
领取关于C/C++更多学习资料:
我在调用printf之前(在地址0x63b处)放了一个断点。根据Linux x86_64调用约定,浮点参数在XMM寄存器中传递(CPU中特殊的小内存位置,可用于对多条数据并行执行同一条指令,但实际上可用于大多数事情) 。因此,我查看了第一个XMM寄存器xmm0,然后:
xmm0中的值之一,当解释为双精度值时,是1,恰好是我们传递给printf的值。同时,当将该寄存器中的值解释为浮点数时,它们是这样(巧合的是,我们得到1.875)。因此,转换确实发生了。这就解释了为什么对于printf,我们在浮点数和双精度参数中都使用%f -浮点数无论如何都会转换为双精度,因此printf不能分辨出两者之间的区别。
同时,scanf的参数是指针,因此不受此转换的*。其原因是因为所有指针类型仅包含内存地址,并且所有内存地址都具有相同的大小(在我的64位计算机上为64位)。因此,当scanf在其格式字符串中获得%f时,它将期望一个float *类型的指针,而当它获得%lf时,将期望得到double *类型的指针。如果格式说明符和指针的类型不匹配,则会产生一些有趣的结果。
由于float的大小为4个字节,而double的大小为8个字节(至少在我的机器上),因此当我们写入float *类型的指针所指向的位置时,我们将覆盖4个字节的内存。同时,如果我们写入由双*指向的位置,则将覆盖8个字节的内存。考虑以下代码:
printf说明符上的.15标志只是使printf精确度更高。由于我们使用的是双精度值(并且正如我刚刚说的那样,%f也适用于printf的双精度值),因此我们实际上可以访问具有这种精度的数字(只要它们不是太大而不能填充即可。我实际上不是对浮点表示非常了解)
编译并运行后,结果如下:
如您所见,如果我们忽略所有类型的*ery,则数字应该匹配,但它们甚至不相近。这是为什么?
好吧,我们给scanf%f说明符,所以它期望一个浮点数*。但是我们传递了一个双*。现在,这些指针的实际值都只是地址-scanf不知道它们之间的区别。它进行了下去,读取我们输入的值,并将其存储为float 。但是浮点数仅占用4个字节,因此scanf只会在我们可用的double变量的8个字节中写入4个字节。在我的情况下,由于我的机器是低位字节序的,因此似乎对应于double变量的细粒度(小有效位)数字的第4个字节将被覆盖。因此,当我们打印出double double back时,我们得到的数字几乎与以前相同,但最低有效数字有所变化。
有想学习更多C/C++知识的,可以点击下方了解更多,领取免费学习资料:
收起
热心网友
回答时间:2022-03-30 12:33
C++中你想建立一个变量的时候,需要告诉编译器变量的数据类型,以便编译器给变量分配存储空间。
格式:int i; 这是整型变量的声明格式。
如果要声明双精度型变量,也就是小数,相同道理
double i;
这样编译器就知道i是一个双精度小数变量。
另外 float也表示小数,是单精度小数。float和double的区别在于,float所允许的小数范围小,double允许的小数范围大
收起
热心网友
回答时间:2022-03-30 14:08
double是C语言中的双精度浮点数类型,用来表示实数。
1 定义:
double var_name;
这样定义一个名字为var_name的double类型变量。
2 赋值:
var_name = 100.325;
同其它类型的赋值语句一样,对var_name赋值用=运算符,右侧可以是任意表达式。
3 输入:
scanf("%lf", &var_name);
%lf格式符号对应double,可以用来对double类型输入,以下输出类似。
4 输出:
printf("%lf", var_name);
收起
热心网友
回答时间:2022-03-30 15:59
a中存的已经是double了,只不过是没有输出来而已你可以用
printf("%.9f\n",a);进行输出
收起
热心网友
回答时间:2022-03-30 18:07
C++中你想建立一个变量的时候,需要告诉编译器变量的数据类型,以便编译器给变量分配存储空间。
格式:int i; 这是整型变量的声明格式。
如果要声明双精度型变量,也就是小数,相同道理
double i;
这样编译器就知道i是一个双精度小数变量。
另外 float也表示小数,是单精度小数。float和double的区别在于,float所允许的小数范围小,double允许的小数范围大。
收起
热心网友
回答时间:2022-03-30 20:32
%d表示输入或输出十进制有符号数;%f表示输入或输出浮点数(float,四字节表示);在C语言中输出不同数据时需要用到不同的格式字符,%d是用来输出十进制整型数据的实际长度输出,%f是以小数形式输出单、双精度度数。以下是详细介绍:
C语言中%d和%f是什么意思啊?
1、%d表示输入或输出十进制有符号数;
2、%f表示输入或输出浮点数(float,四字节表示);
3、另%lf表述输入或输出双精度浮点数(double 8字节表示);
4、在输出不同数据时要用不同的的格式字符,比如说这个%d是用来输出十进制整型数据的实际长度输出;%f是以小数形式输出单、双精度度数,隐含输出6位小数;还有很多,如%s(输出字符串)
收起
热心网友
回答时间:2022-03-30 23:13
你可以用printf("%.nf\n",a);控制小数位数,n随你取值,只要在double精度范围内即可
收起
热心网友
回答时间:2022-03-31 02:11
表示把6.258e+6 赋值给y。用十进制表示是:6258000。 e是科学记数运算,数字很大的数,一般我们用科学记数法表示,例如6230000000000;我们可以用6.23×10^12表示,而它含义是什么呢?从直面上看是将数字6.23中6后面的小数点向右移去12位。
若将6.23×10^12写成6.23E12,即代表将数字6.23中6后面的小数点向右移去12位,在记数中如“:
1. 3×10^4+4×10^4=7×10^4可以写成3E4+4E4=7E4
即 aEc+bEc=a+bEc (1)
2. 4×10^4-7×10^4=-3×10^4可以写成4E4-7E4=-3E4
即 aEc-bEc=a-bEc (2)
3. 3000000×600000=1800000000000
3e6*6e5=1.8e12
即 aEM×bEN=abE(M+N) (3)
收起
热心网友
回答时间:2022-03-31 05:26
可进行格式化输出啊,楼上回答过了!
本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。
收起