C语言中double类型怎么使用?

#include <stdio.h>
void main()
{
double a;
a=1.123456789;
printf("%f\n",a);
}
怎么不行呢?为什么还是一样输出6位小数?

使用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的双精度值),因此我们实际上可以访问具有这种精度的数字(只要它们不是太大而不能填充即可。我实际上不是对浮点表示非常了解)

编译并运行后,结果如下:

如您所见,如果我们忽略所有类型的fuckery,则数字应该匹配,但它们甚至不相近。这是为什么?

好吧,我们给scanf%f说明符,所以它期望一个浮点数*。但是我们传递了一个双*。现在,这些指针的实际值都只是地址-scanf不知道它们之间的区别。它进行了下去,读取我们输入的值,并将其存储为float 。但是浮点数仅占用4个字节,因此scanf只会在我们可用的double变量的8个字节中写入4个字节。在我的情况下,由于我的机器是低位字节序的,因此似乎对应于double变量的细粒度(小有效位)数字的第4个字节将被覆盖。因此,当我们打印出double double back时,我们得到的数字几乎与以前相同,但最低有效数字有所变化。

有想学习更多C/C++知识的,可以点击下方了解更多,领取免费学习资料:
温馨提示:内容为网友见解,仅供参考
第1个回答  2020-11-04
C++中你想建立一个变量的时候,需要告诉编译器变量的数据类型,以便编译器给变量分配存储空间。
格式:int i; 这是整型变量的声明格式。
如果要声明双精度型变量,也就是小数,相同道理
double i;
这样编译器就知道i是一个双精度小数变量。
另外 float也表示小数,是单精度小数。float和double的区别在于,float所允许的小数范围小,double允许的小数范围大
第2个回答  推荐于2017-09-06
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);
第3个回答  推荐于2017-09-29
a中存的已经是double了,只不过是没有输出来而已你可以用
printf("%.9f\n",a);进行输出本回答被提问者采纳
第4个回答  2018-07-31
C++中你想建立一个变量的时候,需要告诉编译器变量的数据类型,以便编译器给变量分配存储空间。
格式:int i; 这是整型变量的声明格式。
如果要声明双精度型变量,也就是小数,相同道理
double i;
这样编译器就知道i是一个双精度小数变量。
另外 float也表示小数,是单精度小数。float和double的区别在于,float所允许的小数范围小,double允许的小数范围大。本回答被网友采纳

C语言double的用法?
用法:同int float 一样,用于声明变量或定义函数的返回值类型,或可用于类型强制转换。例: double a;\/\/变量声明 double sqrt_(double b);\/\/定义函数返回至类型及形参类型 c=(double)3;\/\/将“3”强制转换为double类型并赋给变量c ...

c语言中double 什么意思
在C语言中,"double"是一个关键字,代表着双精度浮点数类型。它用于表示计算机中的实数,具有很高的精度。要创建一个double类型的变量,你可以使用以下语句:`double var_name;`这样就定义了一个名为var_name的双精度浮点数存储空间。变量的赋值操作与其他基本类型类似,例如,你可以这样给var_name赋予一...

c语言中double是什么意思(C语言中double是什么)
可以用格式化输入输出语句scanf和printf进行double类型的输入输出,格式化字符为%lf。定义doublea;可以用scanf("%lf",&a);进行输入。用prinf("%lf",a);进行输出。计算机c语言中double定义什么样的数据 double是指双精度浮点型数据。double型的变量是带符号的IEEE64位(8个字节)双精度浮点数,比float...

c语言中double和float怎么用
1、双精度浮点型数据用%lf输出。因为double是8个字节的,float是4个字节的,%f 的格式就是4个字节的,而 %lf 就是8个字节的。 例如:printf("%lf\\n",x);2、short 占用内存空间2个字节,短整型数据用%d输出 例如:printf("%d\\n",a);例如:include <stdio.h> int main(){double x;sh...

C语言怎样接收double类型变量输入
1、首先我们打开Dev C++软件,新建一个C语言项目,如下图所示 2、接下来在C语言文件中通过scanf让用户输入数字,接着在打印数字,注意这里用的lf接收double数据类型,如下图所示 3、然后我们运行编写好的C语言文件,如下图所示 4、最后在弹出的CMD界面中我们就可以输入double类型的数据了,程序接收到...

c语言中double、 float、 short怎样使用输出?
1.双精度浮点型数据用%lf输出。因为double是8个字节的,float是4个字节的,%f 的格式就是4个字节的,而 %lf 就是8个字节的。 例如:printf("%lf\\n",x);2.short 占用内存空间2个字节,短整型数据用%d输出 例如:printf("%d\\n",a);例:include <stdio.h> int main(){double x;short...

C语言中 long double 该怎怎么用?
在C语言编程中,long double是一个特定的数据类型,专为需要更高精度浮点数运算而设计。要使用它,首要条件是确保你的编译器支持C99标准。验证方法是在代码中尝试定义一个long double类型的变量,如:long double a;如果编译过程没有报错,那么你的编译器就支持C99。如果不支持,可能需要更换或升级到支持...

double在c语言中的意思是什么?
在C语言中,double是一个关键的数据类型标识符,它意味着将变量i和s指定为双精度实数类型。这种类型被用来存储具有较高精度的数值,其值会在内存中以64位(8字节)的形式进行存储。当你使用double时,变量的值将按照双精度浮点数的格式存储,这允许它能够表示大约15到16位的十进制有效数字,具有广泛和...

C语言,double类型的变量使用scanf()函数赋值后再使用printf()输出,为什 ...
c语言中double输入输出,都用 %lf 进行格式化,是否写成了 %f, 这个是float类型。include <stdio.h>int main(){ double d = 0; printf("intput a double:"); scanf("%lf", &d); printf("d = %lf\\n", d); return 0;} 2. 字符定义如下 字符对应数据类型含义 d \/ ...

c中double是什么意思(c语言中double是什么意思)
c语言中double是什么意思 double是C语言的一个关键字,代表双精度浮点型。占8个字节(64位)内存空间。其数值范围为1.7E-308~1.7E+308,双精度完全保证的有效数字是15位,16位只是部分数值有保证。可以用格式化输入输出语句scanf和printf进行double类型的输入输出,格式化字符为%lf。定义doublea;可以用...

相似回答