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


    set n=-2147483648确实可以,然后可以操作set /a n=n+1,但我想问的是set n=-2147483648为什么不行。

TOP

回复 3# 老刘1号

可能吧,我看了操作正数和负数的内存,似乎有点不同,但我不懂汇编。
set /a n=2147483647
  1. jae 00000067
  2. je 00000024
  3. das
  4. popad
  5. and [esi+3D],ch
  6. xor dh,[ecx]
  7. xor al,37
  8. xor al,38
  9. xor esi,[esi]
  10. xor al,37
复制代码
set /a n=-2147483647
  1. jae 00000067
  2. je 00000024
  3. das
  4. popad
  5. and [esi+3D],ch
  6. sub eax,37343132
  7. xor al,38
  8. xor esi,[esi]
  9. xor al,37
复制代码

TOP

回复 6# Five66


    计算机算的是补码,10000000  00000000  00000000  00000000是-2147483648的补码而不是原码。

TOP

回复 5# 老刘1号


我是这样理解的
  1. 32位有符号正整数2147483647原码为:01111111 11111111 11111111 11111111
  2. 加1后
  3. 结果为:10000000  00000000  00000000  00000000 (没有溢出,还是32位,只是计算后最高位变了)
  4. 因为最高位为1,输出时被解析为负数
  5. 而32位有符号整数中
  6. -2147483648的原码就是:10000000  00000000  00000000  00000000  (表示负0)
  7. 正0是:00000000  00000000  00000000  00000000 (32个0)
复制代码

TOP

回复 4# Five66


    你这个结论非常不靠谱
从楼主的
  1. set /a n=2147483647+1
复制代码
测试样例可以看出来,INT_MAX+1是正常溢出到-2147483648也就是INT_MIN
32bit一共只能表示那么多数,哪有地方给你存两个零?
况且历史上也没有这种编码的先例

TOP

大概是
cmd数值范围是-2147483647~214748364,cmd在解析时,判断-2147483648超出范围了,出错
但是32位有符号范围是: -2147483648~214748364,不影响计算,能正常保存并输出
0有两个的,,-2147483648其实是负0,但是一般只使用正0

TOP

纯猜想,可能parser实现的时候不管有没有负号都是按正数读的,之后才转成负数

TOP

可以输入 负数,你的问题是第一个代码框里 使用了  /a ,这是令set计算的用法。
1

评分人数

目的,学习批处理

TOP

返回列表