C++基础题--float型以整型格式输出

 1 int main()
 2 {
 3     float a =765;
 4     a++;
 5     printf("%d\n", a);
 6     system("pause");
 7     return 0;
 8 }
 9 //为什么会输出是0?
10 解释如下:
11 在printf时,float 会自动转换成double型,由32位变到64位。%d输出的是最低的32位。
12 电脑是小端模式,故保存765时,是以下格式
13 栈底(高字节).................栈顶(低字节)
14 765                           0000
15 下面引申一道题
16 int main(){
17   int a;float b,c;
18   scanf("%2d%3f%4f",&a,&b,&c);
19   printf("\na=%d,b=%d,c=%f\n",a,b,c);
20 }
21 若运行时从键盘上输入9876543210l,则上面程序在gcc编译器下的输出结果是a=98,b=0,c=0.000000
22 解析:
23 printf时,float会自动转换为double型,因此变量b 和 变量c 从32位转64位;
24 b是以%d 的格式进行输出,因而输出的是最低的32位。
25 电脑是小端模式--高字节高地址,低字节低地址
26 printf压入栈的顺序是从右到左,因而先压C,再B,再A;
27 栈底(高字节).................栈顶(低字节)
28 4321     0000      765     0000         98
29 4字节     4字节    4字节    4字节      4字节
30 从低字节开始进行输出,
31 首先输出a, 四个字节,即98
32 然后输出b, 四个字节,即0
33 然后输出c,八个字节,是正常方式打印,会一下子读取八个字节,正好前四个字节全是0。由于浮点数存储的方式,
34 64位里面包括了1符号位,11阶数,52尾数,阶数是0,表示-1023 + 1023 = 0,用指数表示:1.#*2^-102335 ‘#’是代表尾数。尾数是000。。。后面数字但很小,所以这个浮点数是非常小的。 这道题可以说是b的输出方式影响
36 了C,如果b用%f输出,那么b和c都会显示正确

 

posted @ 2017-08-20 17:01  繁星的夜空2012  阅读(2377)  评论(0编辑  收藏  举报