从unsigned int转换为float

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

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

虽然floatunsigned int支持更宽范围的值,但它的准确性较低。 浮动有一个23位的尾数,就像你张贴的,只有7位十进制数字。 无符号整数支持9位十进制数字。

建议:使用double ,而不是float

编辑:其实,我收回这个建议; 浮点数和整数数据类型是根本不同的,不能直接转换。 你希望得到什么整数值为Single.MaxValue ? 对于Single.NegativeInfinity ? 解释为什么你想从float转换为int将是有帮助的。

正如你在你的问题中注意到的那样,float只需要7位数字,而不是INT_MAX中的10位数字。 我相信这将是在此转换中发出C4244警告的原因。

从维基百科 :

单精度,在C语言家族中称为“float”,在“real”或“real * 4”中称为“float” Fortran语言。 这是一个二进制格式,占用32位(4字节),其有效位数的精度为24位(约7位十进制数字)。

有一个32位的int(一般)和一个32位的float(有一部分保留为指数),有很多int值不能被浮点类型精确地表示。

试试这个来了解情况

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

你会发现在int为32位或更少的系统上,这实际上是一个无限循环。

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