C语言为什么int用%f输出是0.000000?解决方法
C语言为什么int用%f输出是0.000000?C/C++ codeprintf(%f,2)我是想让这个整形数“2”按照浮点数输出。我猜
C语言为什么int用%f输出是0.000000?
C/C++ codeprintf("%f",2);
我是想让这个整形数“2”按照浮点数输出。
我猜测输出应该是2.0一类的浮点数,可是为什么输出是0.0000000?
如果把代码改成:
C/C++ codeprintf("%f",(float)2);
就可以了,输出就是2.00000
这是为什么呢?
[解决办法]请参考IEEE754浮点数存储标准
printf("%f",2);
这样指定输出并不会进行隐式类型转换,只是将2在内存中的二进制形式按照float存储标准来解析
[解决办法]printf("%f", 2) <- 参数"%f"是运行时的,按照规则编译器是不可能知道你希望第二个参数是浮点数类型,所以也就不可能把int类型的2自动转换成浮点类型的2。
另外%f需要的是64位的double,现在你只提供了低32位,高32位只能依赖栈里原有的数据。double类型最高12位小于1003,对应的十进制数就肯定小于0.000001,所以很容易就会输出0.000000
[解决办法]printf();函数中的参数“%f” “%d”等,只是用来告诉编译器对数据的读取以及处理方式,如果用%f 则编译器会从&2的启示地址开始读取 sizeof(float)个字节然后进行浮点型数据的处理,并不会对原数据做类型转换,所以printf("%f",2); 输出是0.0000000 而 printf("%f",(float)2);输出就是2.00000。至于具体的浮点型数据和整型数据的截取处理方式可以去看看《C primer plus》,里面有提到过,至于具体章节记不清了
[解决办法]请参考IEEE754浮点数存储标准
printf("%f",2);
这样指定输出并不会进行隐式类型转换,只是将2在内存中的二进制形式按照float存储标准来解析
[解决办法]前面有个帖子很火的printf("%f,整形");
不过讨论这些没什么意义
[解决办法]2转化为double类型0|10000000000|0000000000000000000000000000000000000000000000000000
按double读出来就是0*2^11
[解决办法]看看可变参数
[解决办法]在网上你可以看到说 printf 家族函数都是不安全的。
这就是原因。