JS 数据类型
JS
是一种弱类型的语言,它的数据类型包含字符串值,数值,布尔值,数组,对象。虽然我们的数值类型包含浮点数整数等,但是在这里统称为 数值类型
。同时 JavaScript
拥有动态类型,我们定义变量时无须指定数据类型。这也意味着我们的强制转换在JS中将失效。
若在 C/C++
中,可以通过内存转换或联合体实现。但在 JavaScript
中这些方法是无效的(亦或是我太 cai 不知道怎么转)。
IEEE754
是现在公认的、最广泛使用的浮点数转换运算标准,被许多 CPU
与浮点运算器所采用。
IEEEE475
那我们先来看一下 IEEEE475
的Float
格式,有 32bit
以供数据存储,具体划分如下:
这里我们以 0x4128BC90
为例进行讲解:
0x4128BC90(H) = 01000001001010001011110010010000(B)
Sign(符号位)
0
表示正数1
表示负数
Exponent(指数位)
1000 0010(B) = 130 (D)
Significand(小数位)
01010001011110010010000(B) = 0*2^(-1) + 1*2^(-2) + ... + 0*2^(-23)
转换公式
F u n ( x ) = ( − 1 ) S i g n × ( 1 + S i g n i f i c a n d ) × ( 2 ) E x p o n e n t − 127 Fun(x) = (-1)^{Sign} \times (1 + Significand) \times (2)^{Exponent - 127} Fun(x)=(−1)Sign×(1+Significand)×(2)Exponent−127
转换方法
var bytes = new Array();
bytes[0] = 65;
bytes[1] = 40;
bytes[2] = 188;
bytes[3] = 144;
//IEEE754
function hex2float(num) {
//符号位
var sign = (num & 0x80000000) ? -1 : 1;
//指数位
var exponent = ((num >> 23) & 0xff) - 127;
//尾数位
var mantissa = 1 + ((num & 0x7fffff) / 0x7fffff);
return sign * mantissa * Math.pow(2, exponent);
}
//拼接为number对象
var mfloat = ((bytes[0] & 0xFF) << 24) |
((bytes[1] & 0xFF) << 16) |
((bytes[2] & 0xFF) << 8) |
(bytes[3] & 0xFF);
console.log(hex2float(mfloat));
在线工具
以下是个人推荐的两个在线工具,用于验证非常合适:
Float (IEEE754 Single precision 32-bit)