C语言中的类型转换
C语言在int、float、double格式之间进行强制类型转换时,程序按照如下原则来转换数值和位模式(假设int是32位): 1. 从int转换为float,数字不会溢出,但是可能被舍入。 2. 从int或float转换为double,因为double有更大的范围,也有更大的精度,所以能够保留精确的数值。 3. 从double转换成float,因为范围要更小一些,所以值可能溢出成+∞或-∞。另外,由于精度较小,它还可能被舍入。 4. 从double或float转换成int,值将会向0截断。例如,1.999将被转换成1,而-1.999将被转换成-1。注意这种行为与舍入是非常不同的。进一步来说,值可能会溢出。C标准没有对这种情况进行指定固定的结果,但是在大部分机器上,结果将是TMax或TMin。 在Intel IA32处理器中的浮点寄存器使用的是一种特殊的80位精度的扩展精度格式,扩展精度格式表示类似于具有15位指数和63位小数的IEEE浮点格式。所有的单精度和双精度格式的数在从存储器加载到寄存器中的时候都会转换成这种格式。运算总是以扩展精度进行的。当数字存回存储器的时候,它们就会从扩展精度转换成单精度或者双精度格式。 (以上摘录处《深入理解计算机系统》) float的表示法为1位符号位,8位指数位,23位小数位。所以2的24次方(16777216)以下的int型(这里只考虑正数,负数在一个对应的范围)能转换成float能被精确表示,大于16777216的int不能保证能被精确表示。确切地说16777216也不是精确表示的,只能说是恰好能正确表示。 double的表示法为1位符号位,11位指数位,52位小数位。 本文出自 51CTO.COM技术博客 |


bloodhawk
博客统计信息
热门文章
最新评论
友情链接