printf以%d形式输出浮点数的问题

若运行时从键盘上输入9876543210l,则下面程序的输出结果是

int main(){

int a;float b,c;

scanf("%2d%3f%4f",&a,&b,&c);

printf("\na=%d,b=%d,c=%f\n",a,b,c);

}

A.a=98,b=765,c=4321.000000

B.a=98,b=0,c=0

C.a=98,b=765.000000,c=4321.000000

D.a=98,b=765.0,c=4321.0

printf函数执行的时候,会先把这三个数字压入栈里,然后再执行打印。压入栈的时候按照数据本身的长度来,首先把c和b压入,并且每一个都是8个字节(printf自动转化为double)。然后再压入a是4个字节。然后再执行打印。打印的时候按照用户指定的格式来出栈。首先打印a,a打印正常。然后又打印4个字节长度的b,在栈里面由于b长度是八个字节,并且b目前是64位的表示方式,数据的后面全是0.(float 变double),电脑是小端存储方式,0存储在距离a近的地方。打印b的时候,打印的4个字节都是0.然后再打印c,c用正常的方式打印,会一下子读取8个字节,正好,读出来的八个字节前面四个字节全是0,自己可以算一下,实在太小了,因此为0.

栈底                                          栈顶 
高字节 低字节 
4321     0000      765     0000         98

4字节   4字节    4字节    4字节      4字节 
             打印c                 打印b      打印a 
附:浮点数(单精度的float和双精度的double)在内存中以二进制的科学计数法表示,表达式为N = 2^E * F;其中E为阶码(采用移位存储),F为尾数。 
float和double都由符号位、阶码、尾数三部分组成,float存储时使用4个字节,double存储时使用8个字节。各部分占用位宽如下所示: 
             符号位     阶码      尾数     长度 
float              1           8         23      32 
double          1         11        52       64

http://blog.csdn.net/fzp218/article/details/8971701

时间: 2024-08-05 22:48:47

printf以%d形式输出浮点数的问题的相关文章

c语言的printf输出浮点数的一些问题

在printf时:如果以%f格式输出,将输出8个字节(scanf输入时,%f是4个字节) 在参数入栈时如果是float型或者double型 直接入栈8个字节,此时输出及后续输出都没问题 但如果参数小于8个字节且不是float型:比如int   shor int  ,就会扩展符号位,成为4个字节再入栈,但是输出的是8个字节,所以会读取其他参数的入栈结果 #include <stdio.h> #include <stdlib.h> #include <string.h> i

1.1编程基础之输入输出-07:输出浮点数

07:输出浮点数 #include<stdio.h> int main() { double i; scanf("%lf",&i); printf("%f\n",i); printf("%.5f\n",i); printf("%e\n",i); printf("%g\n",i); return 0; } 总时间限制:  1000ms 内存限制:  65536kB 描述 读入一个双精度浮点

//%f表示以十进制格式化输出浮点数 %.2f

//%f表示以十进制格式化输出浮点数 String s1 ="评分: %.1f"; String s2 = String.format(s1, 8.0); System.out.println(s2); System.out.printf("%s%n", new Integer(1212)); // %n表示换行 System.out.printf("%s%n", "end line"); // 还能够支持多个參数 Syste

1-1-07:输出浮点数

总时间限制: 1000ms 内存限制: 65536kB 描述 读入一个双精度浮点数,分别按输出格式“%f”,“%f”保留5位小数,“%e”和“%g”的形式输出这个整数,每次在单独一行上输出. 输入 一个双精度浮点数. 输出 输出有四行:第一行是按“%f”输出的双精度浮点数:第二行是按“%f”保留5位小数输出的双精度浮点数:第三行是按“%e”输出的双精度浮点数:第四行是按“%g”输出的双精度浮点数. 样例输入 12.3456789 样例输出 12.345679 12.34568 1.234568e

char类型变量二进制形式输出

C语言char类型(1字节)以二进制形式输出: #include<stdio.h> void chrtobit(char chr)/* chr是要以二进制形式输出的char值*/{ char tchr=chr; int i; for(i=7;i>=0;i--) { char tmpc=tchr; tmpc=tchr&(1<<i); printf("%d",tmpc>>i); } printf("\n");}

int类型变量以二进制形式输出

C语言int类型(4字节)以二进制形式输出: #include<stdio.h> void intobit(int num)/*num是要以二进制形式输出的int值将二进制数据逐个置1,在右移,依次实现逐个输出*/{ int tnum=num; int i; for(i=31;i>=0;i--) { int tmpa=tnum; tmpa=tnum&(1<<i); ((i+1)%8==0&&i!=31)?printf(" %d",t

[转载] c++ cout 格式化输出浮点数、整数及格方法

C语言里可以用printf(),%f来实现浮点数的格式化输出,用cout呢...? 下面的方法是在网上找到的,如果各位有别的办法谢谢留下... iomanip.h是I/O流控制头文件,就像C里面的格式化输出一样.以下是一些常的: dec 置基数为10 相当于"%d" hex 置基数为16 相当于"%X" oct 置基数为8 相当于"%o" setfill(c) 设填充字符为c setprecision(n) 设显示小数精度为n位 setw(n)

整数/小数以字符串形式输出

1.问题描述 (1).现在从键盘输入一个整数(以%d格式符输入),要求以装换成字符串的形式输出: (2).现在从键盘输入一个小数和小数位数(%lf%d),要求以字符串的形式输出: 这2个问题本身并不难,但是考虑全面和从算法上的优化确实不容易的,需要仔细认真的考虑! 2.用C实现 在VC下面用的VC++6.0版本实现 #include<stdio.h> void printfInt(int data); void printfDouble(double data, int count); voi

C语言K&R习题系列——统计文档中每个单词所占字母个数,以直方图形式输出

原题: Write a program to print a histogram of the lengths of words in its input. It is easy to draw the histogram with the bars horizontal; a vertical orientation is more challenging. 这也是我第一个过百行的代码(带注释,空格什么的) 主要分两个部分:输入和输出 #include < stdio.h > #define