[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[数值计算] [已解决]批处理中set /a怎么利用移位判断正负?

  1. set/a n=a">>"31
  2. ::a>0时,n=0,a<=0时,n=-1
复制代码
set/a 1">>"31
结果为0,是1/(2^31)这样算的是吧,
可是:
set/a -1">>"31
结果是-1,但是-1/2147483648的结果却是0,

就是不明白为什么不是-1?
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

回复 2# garyng

可是-1">>"31的结果为什么会是-1呢?

TOP

回复 4# plp626


    这个看不太明白,能解释下吗?
还有我记得以前在那本绿皮书上说过,当最高位为1的时候,右移的话,有的编译系统是左补0,有的是左补1,左补0的叫“逻辑移位”,左补1的叫“算术移位”
按这样说的话,CMD是左补0还是1?

TOP

回复 6# plp626


    谢谢,明白了!
比如-9>>31
11111111111111111111111111110111
>>31
------------------------------------------------------
11111111111111111111111111111111
反正只要是负数,右移31位,最低位一定是1,再全部左补1,就是-1了。

TOP

可是-1>>31和-1/2147483647不是等价的吗?怎么结果会不一样?

TOP

本帖最后由 JooKin 于 2011-9-7 16:26 编辑

没有大侠指点迷津吗?还是因为太简单了

TOP

回复 10# plp626

d2b得出来的是原码吗?
  1. C:\Documents and Settings\Administrator>set/a 4294967294
  2. -2
  3. C:\Documents and Settings\Administrator>set/a 4294967295
  4. 无效数字。数字精确度限为 32 位。
  5. C:\Documents and Settings\Administrator>set/a -1/4294967295
  6. 无效数字。数字精确度限为 32 位。
复制代码
why?

TOP

回复 12# plp626


    能理解了,
set/a -1/2147483647就是(11111111111111111111111111111111)2÷(01111111111111111111111111111111)2的运算,除了符号位外,原来他们在内部存储的二进制形式都是一样的,所以运算结果就是-1了。

TOP

回复 14# plp626

有点乱|||!请问d2b得出来的是原码还是补码?

TOP

回复 16# plp626


    看不太懂

TOP

返回列表