前置
- 1表示负数
- 0表示正数
- 十进制数,转二进制 ,先拿这个数除以二取余,然后不断拿上一次的商除以2,直到
商为0, 收集每次的余数,最后得到的余数是最高位,就是二进制表示的数 - eg: 9/2 商4余
1-> 4/2 商2余0-> 2/2 商1余0-> 1/2 商0余1 - 从右到左连起来 1001 -> 符号位带上 0 1001
- 十进制数,转二进制 ,先拿这个数除以二取余,然后不断拿上一次的商除以2,直到
那么-9在计算机里分别怎么表示的
练习: 9 -> 0 1001
-9 -> 1 0111
- -9为什么是1 0111? 这是因为计算机里使用的是补码表示数字,好处是硬件只需要有累加器就好了。
- 那么负数的补码怎么算:
对于正数,就是按照上面写的方法,直接转得出 01001 (我们称之为原码),因为正数的补码跟原码一致。
对于负数,这个负数对应的正数的基础上,包括符号位在内按位取反(得出反码), 然后+1.
eg: -9
-> 先写出正9(01001)(我们称之为原码)
-> 按位取反(10110)(我们称之为反码)
-> 然后+1 -> 10111(这就是答案,补码)
试试9+(-9)
包括符号位在内纳入计算
0 1001
+ 1 0111
----------
1 0 0000
从右往左看:
1+1 有进位
0+1 因为上一位有进位,所以变成了 1+1, 继续进位。
... 跟十进制一样的道理,就不每一位分析了
最后发现比原来多出了一位,我们舍去(溢出的位自然也是管不了的), 答案就是 0 0000,刚好~
十进制小数转二进制
- 不断乘以2,拿出整数部分,剩下的小数部分,继续上面的乘以2操作。
最先得到的整数是最高位
举个例子就好
eg: 0.75 -> 0.75 * 2 = 1.5 拿出1剩0.5-> 0.5 * 2 = 1.0 停止,因为小数位到0了 -> 答案 0.11
说清楚老生常谈的0.1+0.2 != 0.3
因为十进制0.1,0.2,0.3换算成二进制,刚好是无限循环的,就跟十进制1/3=0.33333333333一个道理,js个数是64位,无限循环肯定存不完的。这里我取前10位,做例子
0.1 -> 0.0100110110
0.2 -> 0.0011001100
+
----------------------
0.0100110110
而我们直接用上面讲的方法,讲0.3换算成二进制(因为无限循环,我取前面10来位意思一下)
0.3 -> 0.0100110011
我们发现 0.0100110110 !== 0.0100110011
js里采用IEEE754标准,js采用双精度(64位),浮点数如何表示呢:符号位(第1位)+指数位(2-12位)+小数有效位(13-64位) (可忽略)
-
这个标准有效为第一位默认是1,可能是这个标准,浮点数一定得大于1吧,指数位也可以是负