[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
大概是
cmd数值范围是-2147483647~214748364,cmd在解析时,判断-2147483648超出范围了,出错
但是32位有符号范围是: -2147483648~214748364,不影响计算,能正常保存并输出
0有两个的,,-2147483648其实是负0,但是一般只使用正0

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

回复 7# buyiyang


    说是说原码补码,其是我想说的是2进制值

TOP

回复 12# 老刘1号


    厉害了,看了半天,/a开关的执行算术运算的操作数op1, op2跟返回值result的类型都是LONG,不过那是以前的LONG,大概是现在的int32?至于解析的那部分,完全看不懂

TOP

查了下,_tcstol函数是将字符串转 32 位长整数 (long)

而后面的

            if (_istdigit(*tas) || _istalpha(*tas)) {
                rc = MSG_SET_A_INVALID_NUMBER;
                break;
            }

应该就是是在解析操作数时进行判断数字是否合法的

再后面的
case A_ADDOP: result = op1 + op2;   break;

case A_SEPOP: result = op2;         break;
是直接用解析出来的操作数进行计算和赋值的

TOP

返回列表