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
答案 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