看起来JavaScript's number
type与C and C++'s double type完全相同,并且两者都是IEEE 754-1985。
JavaScript可以使用IEEE 754作为整数,但当数字变大或进行算术计算(如除以10
或3
)时,它似乎可以切换到浮点模式。现在C和C只使用IEEE 754作为double
,因此只使用浮点部分,而不使用“整数”部分。因此,C和C没有使用整数表示法吗?
(and C没有使用NaN
、Infinite
、-Infinite
、-0
,因为我记得在C中从未使用过它们)。
2条答案
按热度按时间rjee0c151#
如果是这样的话,IEEE 754中[整数和一些特殊值]的表示形式是否都没有使用,因为C和C没有引用它们的能力?
这个概念看起来好像是源于JavaScript对所有数字都使用IEEE-754 binary 64格式,并执行通过将二进制64格式转换成整数格式以用于实际操作来进行(或至少定义)逐位操作。(例如,JavaScript中的按位AND是通过ECMAScript规范定义的,作为通过将操作数转换为32位有符号整数而获得的位的AND。)
C和C不使用此模型。浮点和整数类型是分开的,并且值不保存在公共容器中。C和C基于操作数的类型计算表达式,并且对于整数和浮点运算的计算方式不同。如果您有某个具有浮点值的变量
x
,则它已被声明为浮点类型。它的行为是这样的,如果变量y
声明为整型,它的行为也是整型.C和C没有指定使用IEEE 754,只是C有一个可选附件指定了IEEE 754的等效项(IEC 60559),并且C和C实现可以选择符合使用IEEE-754格式并且符合它。IEEE-754二进制64格式被C和C实现压倒性地用于
double
,尽管许多在它们的实现中不完全符合IEEE-754。在二进制64格式中,编码为符号位 S、11位“指数”代码 E 和52位“有效数代码”F(表示“分数”,因为S表示有效数,已用于符号位)。表示的值为:
这些表示包括从-253 -1到+253 1(以及更多)的所有整数,都是无穷大,都是零,还有NaN。
如果一个
double
有一个整数值,比如123,那么它只是有这个整数值,它不会变成一个int
,也不会被C或C++当作整数类型。但是从(-253 -1)到(253 -1),有很多数字没有使用......
在binary 64格式中没有未使用的编码,除了人们可能认为大量的NaN编码被浪费了。事实上,许多实现确实浪费了它们,使它们无法访问或难以被程序访问。然而,IEEE-754标准使它们可用于任何用户可能希望将它们用于的目的,并且有人将它们用于调试信息,例如记录创建NaN的程序计数器。
hk8txs482#
int
的数字123
与double
的数字123.0
完全相同,通过测试123 == 123.0
可以很容易地看出这一点,但是它们的表示在内部是不同的。