`

float强制转换的问题及解释

 
阅读更多

 

#include <stdio.h>
int main() {
        float b = 0.58;
	int a;
	a = (int)(b * 100);
	printf("%f , %d\n", b*100, a);
	getchar();
	return 0;
}

 

输出结果为


 

a 在强制转换的时候,直接保留整数部分时,得到57,少了1

 

将b的值改为0.01时,

输出结果如下,


 很奇怪,输出为1.000000, 而强制转换保留整数部分时竟然得到的是0

 

放大%f 的输出格式 改为%.10f ,输出10位,结果如下


虽然float类型能够表示的位数是6到7位, 但是足以说明浮点数在计算机中的表示是不准确的

尤其在float 转 int时, 更加应该注意, 如果想四舍五入,在浮点数加上0.5以后,再进行强制转换

 

以下参考http://www.cnblogs.com/tekson/archive/2009/07/16/1524604.html

 

以下参考http://www.cnblogs.com/Xiao_bird/archive/2010/03/26/1696908.html

printf格式串中的%f到底是float还是double?实验来证明!

最近在CSDN上看到一个网友写下了类似如下代码,想以小数格式输出一个整数:

int a = 0, b = 0;
printf(
"%f, %d", a, b);

可是运行结果并不尽如人意,%f字段输出了0,%d字段输出一个较大的数据。

因为我最近刚阅读了浮点数的内存表示方法,所以对上述代码做出解释如下:
%f为double类型,需要两个字节表示,所以,printf在遇到%f时即将a,b的两个整型数据都读了去,而到了需要输出%d的时候,只能读取b的下一个单元,自然不是所期望的数据了。

但是有朋友说%f是float类型,%lf才是double类型,具此我特意查阅了MSDN和Linux man手册,均没有发现此类描述,在linux man手册中,说明%lf为long double类型。
为了说明问题,我又做了几个实验:

实验一,检查%f需要读取几个字节

int a=0, b=0, c=5;
printf(
"%f,%d\n", a, b, c);

输出结果:
0,5
结论:%f读取8个字节,即两个整型大小

实验二,检查%lf需要读取几个字节

int a=0, b=0, c=5;
printf(
"%lf,%d\n", a, b, c);

输出结果:
0,5
结论:%lf也读取8个字节(也许和机器位宽有关,我是32位的机器)

实验三,检查printf读取float类型数据

float a=0.0f;
int b=5;
printf(
"%f,%d\n", a, b);

输出结果:
0.0,5
结论:float类型只占4个字节的数据,但前面实验一已经证明%f会读8个字节,即double类型的宽度,所以,编译器在将float类型参数入栈的时候,事先转换成了double类型。

实验四,再次证明实验三的结论

float a=0.0f;
int b=5;
printf(
"%d,%d,%d\n", a, b);

输出结果:
0,0,5
结论:a在入栈的时候,占了8个字节。

以上4步,我觉得可以证明%f是按double类型输出的了,另外,我也知道了float类型在作为参数进行传递的时候,编译器会先将它转换成double类型。

 

 

  • 大小: 4.8 KB
  • 大小: 4.6 KB
  • 大小: 4.4 KB
  • 大小: 21.7 KB
分享到:
评论

相关推荐

    C语言中int到float的强制类型转换

    最近项目中经常需要int与float之间转换,有必要对它们之间转换的原理做个了解。

    C++ 四种强制类型转换的总结

    C++ 四种强制类型转换的总结

    数据类型演示实例,类型强制转换

    数据类型演示。强制转换。 例如cout(float)a*b is:"(float)a*b;

    Python如何实现强制数据类型转换

    这篇文章主要介绍了Python如何实现强制数据类型转换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 常用转换函数 函数 作用 int(x) 将x转换成整数类型 ...

    C021强制类型转换

    #include void main() { float x=7.6,y=3.2; printf("x+y=%f\n",x+y); printf(“强制类型转换后\n”); printf("x+y=%d\n",(int)x+(int)y); /*将x和y强制转换为整型后再相加*/ }

    python的强制类型转换规则.docx

    python的强制类型转换规则 Python的强制类型转换规则 Python是一种动态类型语言,这意味着变量的类型是在运行时确定的。在Python中,变量可以随时被赋予不同类型的值,这使得Python非常灵活和易于使用。但是,有时候...

    EasyCast:通过在Int,Float,CGFloat和Double之间添加自动转换来简化Swift中的数学运算。 小心使用

    Swift的类型安全性以明显的强制转换乱码。 您正在做一些假设不成问题的事情。 你知道它是如何工作的。 什么时候不使用 您首先需要类型安全。 您正在研究科学或学术软件。 你不知道它是如何工作的,

    Java中各个数据类型之间的转换

    自动类型转换,也称隐式类型转换,是指不需要书写代码,由系统自动完成的类型转换。...整数强制转换为整数时取数字的低位,例如int类型的变量转换为byte类型时,则只去int类型的低8位(也就是最后一个字节)的值。

    C#自动类型转换与强制类型转换的讲解

    自动类型转换 隐式类型转换 – 这些转换是 C# 默认的以安全方式进行的转换, 不会导致数据丢失。例如,从小的整数类型转换为大的整数类型,从派生类转换为基类。 转换规则 从存储范围小的类型到...强制类型转换 显式

    Cast-Free-Arithmetic-in-Swift:Swift 2.0中的无强制转换算术运算!

    Swift中的无强制转换算法需要:Swift 2.0+ 使用Swift中的无强制转换算术,您不再需要强制转换以对不匹配的数字类型进行算术运算。 ###单字母转换将单字母属性转换为Float,CGFloat,Double,Int let num:Double = 12...

    Qt中所有类型转换

    详细说明了Qt中所有类型转换,也说明了Qt中类型如何转化成C++语言中的类型

    python 内置函数汇总详解

    dict() 强制转换为字典类型 list() 强制转换为列表类型 tuple() 强制转换为元组类型 int() 强制转为整形 str() 强制转换为字符串类型 bool() 强制转换为布尔类型 set() 强制转换为集合类型 2.输入输出 ...

    python学习 day3

    二级容器变量的缓存机制【1】Number型int 整型float 浮点型bool 布尔型complex 复数型【2】容器类型强制类型转换Number型的转换( int float bool complex )(int) 强制转换成整型(float) 强制转换成浮点型(complex) ...

    tensorflow 实现数据类型转换

    将张量强制转换为bfloat16类型。(deprecated) tf.to_bfloat16( x, name='ToBFloat16' ) 参数: x:张量或稀疏张量或索引切片。 name:操作的名称(可选)。 返回值: 一种与bfloat16类型的x形状相同的张量或稀

    VC++类型转换整理(PDF格式)

    经过类型强制转换,可以将CString类型转换成char*,例如: CString cStr = "Hello,world!"; char* zStr = (char*)(LPCTSTR)cStr; 2、char* to CString char*类型可以直接给CString,完成自动转换,例如: char* ...

    vc计算器源代码,支持各种进制正余弦的计算器,vc多功能计算器,vc计算器,mfc计算器,

    **测试我的时发现好多后边多0.0000001,或者少了0.0000001,后来发现是强制转换出了问题..所以只能用double型数据,因为%f输出的就是double型,如果用float那是强制转换,有时会出错 本人懒得重新上传了,空间有限 参考...

    C++数据精度问题(对浮点数保存指定位小数)

    1、背景 对浮点数保存指定位小数。比如, 1.123456. 要保存1位小数,,调用.../* 函数参数:float src:待求精度数 int bits:精度(0表示保留小数点后0位小数,1表示保留1位小数,2:表示保留2位小数) /* 函数返回值

    Java基础面试题.doc

    1、String 是最基本的数据类型吗?...由于1是int类型,因此s1+1运算结果也是int 型,需要强制转换类型才能赋值给short型。而short s1 = 1; s1 += 1;可以正确编译,因为s1+= 1;相当于s1 = (short)(s

    php学习之数据类型之间的转换代码

    复制代码 代码如下: /*数据类型之间相互转换 * 一种是强制转换 * setType(变量,类型); //int,integer,float,double等等。 * 这个函数将原变量的类型改变,用var_dump();可以查看变量 * * 在赋值前使用(类型)的形式,...

    JAVA8大数据类型.pdf

    低---------------------------------------------&gt;⾼ byte,short,char-&gt; int -&gt; long -&gt; float -&gt; double 运算中,不同类型的数据先转化为同⼀类型,然后进⾏运算,转换规则如下: 基本数据类型的强制转换: 强制...

Global site tag (gtag.js) - Google Analytics