`

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的强制类型转换

    C语言中int到float的强制类型转换 在C语言中,强制类型转换是非常常见的操作之一,而int到float的强制类型转换则是其中一种非常重要的类型转换。在项目中经常会遇到需要将int类型的数据转换为float类型的情况,这...

    java 常用基础类型之强制转换

    在“java 常用基础类型之强制转换”这个主题中,我们将深入探讨Java中的基本数据类型转换规则和注意事项。 1. **基本数据类型的转换** Java中有八种基本数据类型:`byte`, `short`, `int`, `long`, `float`, `...

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

    ### C++ 四种强制类型转换的总结 在C++编程语言中,为了实现不同数据类型之间的转换,提供了四种不同的强制类型转换操作符:`static_cast`、`const_cast`、`dynamic_cast` 和 `reinterpret_cast`。这些操作符不仅在...

    强制转换指针类型

    ### 强制转换指针类型 #### 指针与函数指针的本质 在计算机编程中,特别是C/C++语言中,指针是一种非常重要的数据类型。它存储的是内存地址而不是具体的值。对于指针的理解至关重要,因为它涉及到如何有效地访问和...

    vc中float与DWORD的互想转换实现代码

    这个函数通过类型强制转换实现了转换。它首先将float类型的指针转换为DWORD类型的指针,然后解引用这个指针来获取DWORD值。这种方法依赖于C++的内存对齐规则,即float和DWORD在内存中的字节数和排列方式相同。在...

    C语言 自动转换与强制转换.zip

    在C语言中,类型转换是编程过程中的重要概念,它涉及到数据类型的相互转换。自动转换(也称为隐式转换)和强制...在实际编程中,应谨慎使用强制转换,并始终注意类型转换可能导致的问题,以保证程序的正确性和稳定性。

    显式类型转换,类型强制转换为浮点型和整型

    显式类型转换,也称为类型强制转换,允许程序员明确地将一个数据类型的值转换为另一个数据类型。这在处理不同数据精度或者需要特定类型变量时尤其有用。本篇文章将深入探讨显式类型转换,特别是将变量转换为浮点型和...

    C#强制类型转换

    `int` 类型可以隐式转换为 `long`、`float`、`double` 或 `decimal` 类型,但是从 `long` 类型到 `int` 类型的转换需要使用显式强制转换,否则会产生编译错误。 `Int32.Parse()` 方法是将数字的字符串转换为 32 位...

    强制类型转换

    这里,`(int)(a + b)` 首先计算 `a` 和 `b` 的和,得到一个 `double` 类型的结果,然后立即将其强制转换为 `int` 类型,同样丢弃小数部分,因此 `c` 的值是 83。 需要注意的是,如果尝试将一个不能直接转换的数据...

    Java基础之隐式转换vs强制转换

    主要分为两种类型:隐式转换和强制转换。 隐式转换是指在某些特定情况下,编译器会自动进行的数据类型转换,无需程序员显式指定。在Java中,隐式转换通常发生在数据类型之间的“从小到大”的转换,即从较小的数据...

    浅谈Java数值类型的转换与强制转换

    例如,float类型的值需要强制转换为int类型时,可能会损失小数部分。 强制类型转换是Java中一种用于将一个数值类型转换为另一个数值类型的方法。强制类型转换的语法格式是在圆括号中给出想要转换的目标类型,后面...

    float_char_int_string.rar_char float_char int 转换_char to string_

    对于`float`到`int`的转换,可以通过强制类型转换实现,但可能会丢失小数部分。例如:`int i = (int)f;` 如果需要四舍五入,可以结合`round`函数使用。 `string`到`int`和`int`到`string`的转换。`std::string`对象...

    Test_int_to_float.rar_float

    1. **显式转换**:使用`(float)`强制类型转换操作符可以将`int`转换为`float`。例如: ```java int intValue = 10; float floatValue = (float) intValue; ``` 这种方法简单明了,但需要注意的是,如果`int`值...

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

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

    float-to-hex.zip_float_float linux_float 转hex_hex float

    在Linux操作系统中,将浮点数(float)转换为十六进制(hex)是一项常见的编程任务,特别是在处理底层数据表示或进行数值计算时。本文将详细介绍如何在Linux环境下实现这一转换,并提供源代码示例。 浮点数在计算机...

    Java中强制类型转换共2页.pdf.zip

    - **浮点型转换**:float可以自动转换为double,而double转换为float、float转换为int或long,或者任何整型转换为float或double都需要强制转换。浮点转换可能丢失精度,因为浮点数是近似表示的。 4. **类型转换...

    Test_float_to_long.rar_float_float linux

    综上所述,`Test_float_to_long.java`文件可能包含了上述讨论的各种知识点,通过编写和执行这个测试用例,开发者可以确保在Linux环境下Android系统的浮点数到长整型转换的正确性,避免潜在的精度问题和运行时异常。

    程序设计-强制类型转换.pptx

    例如,在进行强制类型转换时,需要注意类型转换的方向、类型转换的安全性等问题。 自动类型转换 自动类型转换是指在运算过程中发生的自动类型转换,该类型转换无需用户干预,系统自动识别完成。在自动类型转换中,...

    Unity3D设计基础-数据类型转换.pptx

    在Unity3D开发中,理解数据类型转换是非常重要的,因为这涉及到...在进行强制转换时,开发者应特别小心,以防止因数据丢失而引发的潜在问题。理解并熟练掌握这两种转换方式,对于编写高效、无错的Unity3D代码至关重要。

    float_double_explicit.rar_float

    例如,将double强制转换为float可能会丢失部分信息,因为float的表示范围和精度都小于double。因此,使用“explicit”关键字进行类型转换可以防止隐式转换,从而避免潜在的错误。 gtest_pred_impl.c可能是Google ...

Global site tag (gtag.js) - Google Analytics