从unsigned int转换为float

时间:2010-08-04 00:20:41

标签: c++ windows variables types

warning C4244: '=' : conversion from 'unsigned int' to 'float', possible loss of data  

浮点数不应该能够处理int中的任何值吗?

unsigned int: 0 to 4,294,967,295  
float 3.4E +/- 38 (7 digits) 

维基:

The advantage of floating-point representation over fixed-point (and
     

整数)表示它可以   支持更广泛的价值观。

任何见解都会有所帮助,谢谢。

http://msdn.microsoft.com/en-us/library/s3f49ktz%28VS.80%29.aspx

5 个答案:

答案 0 :(得分:12)

'unsigned int'和'float'都使用32位来存储值。由于浮子的范围较大,因此必然会牺牲一些精度。这意味着有一些无符号的int值,不能在float中准确表示。 MSDN提供了更多详细信息。

答案 1 :(得分:7)

虽然float支持比unsigned int更广泛的值,但它的准确性较低。 Floats有一个23位的尾数,正如你发布的那样,只有大约7位小数。 unsigned ints支持超过9位十进制数字。

建议:使用double,而不是float

修改: 实际上,我撤回了这个建议;浮点数和整数数据类型根本不同,不能直接转换。您希望Single.MaxValue得到什么整数值?对于Single.NegativeInfinity?解释您希望从float转换为int的原因会有所帮助。

答案 2 :(得分:3)

正如您在问题中所述,浮点数仅占7位数,而INT_MAX中则为10位数。我相信这是在此次转换时发出C4244警告的原因。

答案 3 :(得分:3)

来自wikipedia

  

C语言系列中称为“float”的单精度,以及“real”或“real * 4”? Fortran语言。这是一种占用32位(4字节)的二进制格式,其有效位数的精度为24位(约7位小数)。

如果int具有32位(通常)和具有32位的浮点数(为指数保留部分),则有许多int值无法由浮点类型精确表示。

答案 4 :(得分:2)

试试这个以了解情况

float f = 0.0f;
while (f < (INT_MAX-1))
   f++;

你会发现这对于int为32位或更少的系统来说确实是一个无限循环。

有趣的是闯入无限循环,看看f的值是什么,f == f + 1