时间对象取反,一个1000人群没一个人会的问题。

编程小鱼酱
优质创作者: C/C++技术领域
领域专家: 游戏开发技术领域
2017-05-19 11:40:31
var a = new Date;
var temp =Date.parse(a);
document.write(temp+"<br/>"+ ~temp+"<br/>"+a.getTime());


打印如下

1495165086721
-516466993



本来要用C++ 来写的,可是 C++里 1495165086721 取反是 -1495165086722

初步怀疑这个数有被截断的可能,请大家帮忙
...全文
503 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
似梦飞花 2017-05-19
  • 打赏
  • 举报
回复
var a=1495165086721; var x=a.toString(2); x=parseInt(x,2); console.log(x,a); 并没截断 自己转换成二进制后转下试试
似梦飞花 2017-05-19
  • 打赏
  • 举报
回复
天际的海浪 2017-05-19
  • 打赏
  • 举报
回复
对于补码来说,(-1)-n 就等价于 ~n按位取反了
天际的海浪 2017-05-19
  • 打赏
  • 举报
回复
如 var n = 1495165086721; console.log(n.toString(2)); console.log(n); var n1 = n>>0; console.log(n1.toString(2)); console.log(n1); var n2 = ~n1; console.log(n2.toString(2)); console.log(n2); 输出 10101110000011110110010001010110000000001 1495165086721 11110110010001010110000000001 516467713 -11110110010001010110000000010 -516467714
编程小鱼酱 2017-05-19
  • 打赏
  • 举报
回复
引用 15 楼 jslang 的回复:
[quote=引用 3 楼 hiwoshixiaoyu 的回复:] [quote=引用 2 楼 zzgzzg00 的回复:] var a=1495165086721; var x=a.toString(2); x=parseInt(x,2); console.log(x,a); 并没截断 自己转换成二进制后转下试试
1495165086721 取反为什么是 -516466993[/quote] 因为js的位运算只支持32位的,不支持64位(长整型),超过32位的数据在位运算时高位将被截断 [/quote] 十分感谢
编程小鱼酱 2017-05-19
  • 打赏
  • 举报
回复
引用 16 楼 miaoch 的回复:
这是JavaScript高级程序编程里面的话: 位操作符用于在最基本的层次上,即按内存中表示数值的位来操作数值。ECMAScript 中的所有数 值都以IEEE-754 64 位格式存储,但位操作符并不直接操作64 位的值。而是先将64 位的值转换成32 位 的整数,然后执行操作,最后再将结果转换回64 位。对于开发人员来说,由于64 位存储格式是透明的, 因此整个过程就像是只存在32 位的整数一样。
说的有道理
miaoch 2017-05-19
  • 打赏
  • 举报
回复
这是JavaScript高级程序编程里面的话: 位操作符用于在最基本的层次上,即按内存中表示数值的位来操作数值。ECMAScript 中的所有数 值都以IEEE-754 64 位格式存储,但位操作符并不直接操作64 位的值。而是先将64 位的值转换成32 位 的整数,然后执行操作,最后再将结果转换回64 位。对于开发人员来说,由于64 位存储格式是透明的, 因此整个过程就像是只存在32 位的整数一样。
天际的海浪 2017-05-19
  • 打赏
  • 举报
回复
引用 3 楼 hiwoshixiaoyu 的回复:
[quote=引用 2 楼 zzgzzg00 的回复:] var a=1495165086721; var x=a.toString(2); x=parseInt(x,2); console.log(x,a); 并没截断 自己转换成二进制后转下试试
1495165086721 取反为什么是 -516466993[/quote] 因为js的位运算只支持32位的,不支持64位(长整型),超过32位的数据在位运算时高位将被截断
miaoch 2017-05-19
  • 打赏
  • 举报
回复
引用 10 楼 hiwoshixiaoyu 的回复:
[quote=引用 8 楼 xiaojunjor 的回复:] [quote=引用 6 楼 hiwoshixiaoyu 的回复:] [quote=引用 4 楼 xiaojunjor 的回复:] ~ 是按位取反,而系统中对于整数保存的是补码,而我们看到的数是正码,补码是正码按位求反+1,最高位是正负值不变,所以~1结果是-2 这个按位运算貌似在任何语言中都是这样的
没那么简单 ,你看看一看打印 2147483650 取反2147483645 2147483649 取反2147483646 2147483648 取反 2147483647 2147483647 取反-2147483648 2147483646 取反 -2147483647[/quote] 你最好用小点的数测试,关于为什么2147483648取反是正数,是因为从2147483648开始往上第32位都是1,取反变为0,所以正负号没变,我没记错的话,你找一个强类型语言设为long型,那就会变成从64位开始算,那2147483648取反就还是负数[/quote] 我想问的是 1495165086721 取反 在js中是如何计算的 -516466993[/quote] 1495165086721 转成二进制是 10101110000011110110010001010110000000001 截断后32位 00011110110010001010110000000001 是516467713 对这个二进制~ 相当于就是取反-1 也就是-516467714
miaoch 2017-05-19
  • 打赏
  • 举报
回复
而后面举的5个例子,是刚好撑满了32位,第一位是1,所以取反后变0又变成正数了 比如第一个 2147483650 二进制是 10000000000000000000000000000010 取反是 011111111111111111111111111111111101 刚好是前面一个-5 2147483645
lanlvy 2017-05-19
  • 打赏
  • 举报
回复
http://blog.csdn.net/wenxinwukui234/article/details/42119265
lanlvy 2017-05-19
  • 打赏
  • 举报
回复
最大值 Math.pow(2,32)/2 - 1,超过这个值取反的值就不一定准确了
编程小鱼酱 2017-05-19
  • 打赏
  • 举报
回复
引用 8 楼 xiaojunjor 的回复:
[quote=引用 6 楼 hiwoshixiaoyu 的回复:] [quote=引用 4 楼 xiaojunjor 的回复:] ~ 是按位取反,而系统中对于整数保存的是补码,而我们看到的数是正码,补码是正码按位求反+1,最高位是正负值不变,所以~1结果是-2 这个按位运算貌似在任何语言中都是这样的
没那么简单 ,你看看一看打印 2147483650 取反2147483645 2147483649 取反2147483646 2147483648 取反 2147483647 2147483647 取反-2147483648 2147483646 取反 -2147483647[/quote] 你最好用小点的数测试,关于为什么2147483648取反是正数,是因为从2147483648开始往上第32位都是1,取反变为0,所以正负号没变,我没记错的话,你找一个强类型语言设为long型,那就会变成从64位开始算,那2147483648取反就还是负数[/quote] 我想问的是 1495165086721 取反 在js中是如何计算的 -516466993
miaoch 2017-05-19
  • 打赏
  • 举报
回复
我不知道为什么 但是结果显示的确是截断了。 像楼主举的例子只要是转成二进制超过32位的都只保留32位,然后再对结果取反
xiaojunjor 2017-05-19
  • 打赏
  • 举报
回复
引用 6 楼 hiwoshixiaoyu 的回复:
[quote=引用 4 楼 xiaojunjor 的回复:] ~ 是按位取反,而系统中对于整数保存的是补码,而我们看到的数是正码,补码是正码按位求反+1,最高位是正负值不变,所以~1结果是-2 这个按位运算貌似在任何语言中都是这样的
没那么简单 ,你看看一看打印 2147483650 取反2147483645 2147483649 取反2147483646 2147483648 取反 2147483647 2147483647 取反-2147483648 2147483646 取反 -2147483647[/quote] 你最好用小点的数测试,关于为什么2147483648取反是正数,是因为从2147483648开始往上第32位都是1,取反变为0,所以正负号没变,我没记错的话,你找一个强类型语言设为long型,那就会变成从64位开始算,那2147483648取反就还是负数
编程小鱼酱 2017-05-19
  • 打赏
  • 举报
回复
要是 有那么简单,我就不会问这样的问题了。 我觉得 有溢出
编程小鱼酱 2017-05-19
  • 打赏
  • 举报
回复
引用 4 楼 xiaojunjor 的回复:
~ 是按位取反,而系统中对于整数保存的是补码,而我们看到的数是正码,补码是正码按位求反+1,最高位是正负值不变,所以~1结果是-2 这个按位运算貌似在任何语言中都是这样的
没那么简单 ,你看看一看打印 2147483650 取反2147483645 2147483649 取反2147483646 2147483648 取反 2147483647 2147483647 取反-2147483648 2147483646 取反 -2147483647
xiaojunjor 2017-05-19
  • 打赏
  • 举报
回复
引用 4 楼 xiaojunjor 的回复:
~ 是按位取反,而系统中对于整数保存的是补码,而我们看到的数是正码,补码是正码按位求反+1,最高位是正负值不变,所以~1结果是-2 这个按位运算貌似在任何语言中都是这样的
忘了说了,正数的正码反码补码一样,负数的正码按位求反是反码,反码+1是补码
xiaojunjor 2017-05-19
  • 打赏
  • 举报
回复
~ 是按位取反,而系统中对于整数保存的是补码,而我们看到的数是正码,补码是正码按位求反+1,最高位是正负值不变,所以~1结果是-2 这个按位运算貌似在任何语言中都是这样的
编程小鱼酱 2017-05-19
  • 打赏
  • 举报
回复
引用 2 楼 zzgzzg00 的回复:
var a=1495165086721; var x=a.toString(2); x=parseInt(x,2); console.log(x,a); 并没截断 自己转换成二进制后转下试试
1495165086721 取反为什么是 -516466993

87,994

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧