printf("%f\n",5)的输出结果为什么是0.000000

1,之所以没输出5,这是C语言设计的原因。2,之所以输出0,这是计算机体系结构的问题。

具体来说:

printf函数不会进行任何类型转换,它只是从内存中读出你所提供的元素的值(按照%d,%f等控制字符提示的格式)。C语言设计中,int类型一般是32bit或者16bit,而float一般是64bit,并且有可能使用科学计数保存。这点就和huhugo88所说一样,5在内存中为00000000,00000101。而且5一般都在静态区,程序的静态存储区默认是0,那么当用%f来读时,就会读64bit,也就是会读之前的很多位0,最后按照(有效数字)×(基数2)pow(指数)的方式来取数,自然结果是0

之所以Vc中不允许这种情况,而有些编译器就允许这么输出就是编译器设置的问题。按理说,这样访问内存是属于越界访问,应该禁止。不过只是读,伤害性不大而已。-----------规范方法:
  1. 使用正确的格式 比如printf("%d\n", 5);
  2. 如果一定要用%f 那么让系统知道你的5是float型的。 具体的有两种方法

    1) printf("%f\n",5.0); 带上小数部分,就默认为浮点型了

    2) 强制类型转换 printf("%f", (float)5);

				
时间: 2024-10-13 06:41:48

printf("%f\n",5)的输出结果为什么是0.000000的相关文章

printf("%d",5.01)和printf("%f",5)的输出结果

printf("%f\n",5); printf("%d\n",5.01); printf("%f\n", (float)5); printf("%f\n", 5.f); out:0.00000018897856105.0000005.000000看到结果,会感觉非常奇怪.1处怎么会输出0呢?2又为何会显示这么大的一个数呢?解释:下面是转自网上的一篇博客的解释1,之所以没输出5,这是C语言设计的原因.2,之所以输出0,这是计算

printf("%f %d")

测试环境  GCC printf("%f, %d",)     => 0.000000,  随机数 int  a = 5; printf("%f",a);      =>0.00000 printf("%f, %d", a,b,c);  处理过程  (没有看源码 ,单纯做了一些输出测试) 在参数中依次查找float, 如果存在,则输出,否则 0.000000 在参数中查找第一个int, 如果存在则输出, 不存在则 输出随机数

%.*f (特殊的输出符)

c语言中每一种数据类型都有自己的专属占位符,如整型的%d,浮点型的%f等,而*也是一个占位符,比较特殊而已. 比如输入一个n,输出0.5的n次方,就可以这么写 #include<bits/stdc++.h> using namespace std; int main() { int n; scanf("%d",&n); printf("%.*f\n",n,pow(0.5,n)); } 原文地址:https://www.cnblogs.com/zh

C 语言中的printf()多参数输出问题

问题: x=1; y=2; printf("%d",x+y,x++,y++); 输出结果为什么是5? 首先解释一点,x+y,x++,y++是逗号表达式,逗号表达式的结果是最后一个表达式的结果. 但是在这里printf()函数是从左往右读取,然后将先读取放到栈底,最后读取的放在栈顶,处理时候是从栈顶开始的,所以我们看见的结果是,从右边开始处理的. 读取入栈:                                                           处理计算:  

解释int a=9;printf(&quot;%d,%d&quot;,a,a++)?输出情况

结论取自知乎前辈: 任何在同一个表达式内多次使用++/--的C语言题目都无助于你学习C语言. 这种行为是未定义的行为,换句话说,结果是多少是不确定的.不要过分去研究这类题目,没有意义.同时正确的代码里也不应该有这种不确定结果的表达式出现,在项目代码里,一般来说都严格禁止这样使用. 下面解释原因: 首先,printf的入栈顺序是从右到左,任何一个标准库的printf都是这样的,否则printf无法在栈顶取到最左边的第一个参数. 那么,你的这个题目的一种可能的运行状态是: 1. 取a的值,入栈(右边

unsigned short A = 10; printf(&quot;~A = %u\n&quot;, ~A); char c=128; printf(&quot;c=%d\n&quot;,c); 输出多少?

这是题目给出的答案:第一题,-A =0xfffffff5,int值 为-11,但输出的是uint.所以输出4294967285 第二题,c=0x10,输出的是int,最高位为1,是负数,所以它的值就是0x00的补码就是128,所以输出-128.这两道题都是在考察二进制向int或uint转换时的最高位处理. 我不明白为什么-A =0xfffffff5,还有为什么c=0x10,不应该是c=0x08吗,不好意思各位大侠,小弟的分数用完了.谢谢回答 2^32=4294967296, A=10,为无符号型

java 有千位分隔逗号的数字格式化输出 数字前补0输出

System.out.printf("%,5d %,6.1f\n", 312342, 3155623.932);输出:312,342 3,155,623.9 System.out.printf("%05d %06.1f\n", 32, 32.32);输出:00032 0032.3

c++ cout输出不足位补0 setw、setfill

头文件:<iomanip> 函数:setw(int n) 函数:setfill(char c) cout<<setw(8)<<setfill('0')<<123<<endl; 输出:00000123 C语言 printf("%08d \n",123); 输出:00000123 在C++中setw(int n)用来控制输出间隔·一般setw(int n)默认输出空格间隔,输出n-1空格间隔例如:cout << ‘’

输出一个字符串遇见‘\0’停止并返回字符串字符的个数

#include<stdio.h> int strlenn(char *string) { int length = 0; int i = 0; for (i = 0; i < 6; i++) { if (*string != '\0') { printf("%c", *string); } if(*string++!= '\0') { length += 1; } } return length; } int main() { char arr1[]="a