Delphi基础不够扎实,上来求大神解答,以下代码的意思:var
  sPayPower:Double;
  aMoney: Int64;
  sPayTimes:Integer;
  arrMoney4: array [0..3] of byte;
  aTimes, CS1, CS2: byte;
begin
          aMoney := trunc(Abs(sPayPower));
          aMoney := aMoney * 1000;
          aTimes := CalPayTimes(sPayTimes);          fillchar(arrMoney4, sizeof(arrMoney4), 0);
          move(aMoney, arrMoney4, sizeof(aMoney));          CS1 := byte((arrMoney4[0] + arrMoney4[1] + arrMoney4[2] + arrMoney4[3] + Ord('X')) mod 256);
          CS2 := byte((arrMoney4[0] + arrMoney4[1] + arrMoney4[2] + arrMoney4[3] + aTimes)   mod 256);          CS1 := (CS1 shl 4) + (CS1 shr 4);
          CS2 := (CS2 shl 4) + (CS2 shr 4);          arrMoney4[0] := (arrMoney4[0] shl 4) + (arrMoney4[0] shr 4);
          arrMoney4[1] := (arrMoney4[1] shl 4) + (arrMoney4[1] shr 4);
          arrMoney4[2] := (arrMoney4[2] shl 4) + (arrMoney4[2] shr 4);
          arrMoney4[3] := (arrMoney4[3] shl 4) + (arrMoney4[3] shr 4);
end;
DelphisizeofMove shr  shl

解决方案 »

  1.   


    var
      sPayPower:Double;
      aMoney: Int64;
      sPayTimes:Integer;
      arrMoney4: array [0..3] of byte;
      aTimes, CS1, CS2: byte;
    begin
              aMoney := trunc(Abs(sPayPower)); //Abs: 取绝对值, trunc取整
              aMoney := aMoney * 1000;
              aTimes := CalPayTimes(sPayTimes); //CalPayTimes用户自定义函数          fillchar(arrMoney4, sizeof(arrMoney4), 0);为arrMoney4赋初值, 全部为0
              move(aMoney, arrMoney4, sizeof(aMoney)); //将aMoney的值放入arrMoney4          CS1 := byte((arrMoney4[0] + arrMoney4[1] + arrMoney4[2] + arrMoney4[3] + Ord('X')) mod 256);//将arrMoney4数组各元素值相加后用256取模
              CS2 := byte((arrMoney4[0] + arrMoney4[1] + arrMoney4[2] + arrMoney4[3] + aTimes)   mod 256);//同上          CS1 := (CS1 shl 4) + (CS1 shr 4);//CS1 := cs1的2进制值左移4位 + cs1的2进制值右移4位
              CS2 := (CS2 shl 4) + (CS2 shr 4);//理同上
             //下边4个, 理同上
              arrMoney4[0] := (arrMoney4[0] shl 4) + (arrMoney4[0] shr 4);
              arrMoney4[1] := (arrMoney4[1] shl 4) + (arrMoney4[1] shr 4);
              arrMoney4[2] := (arrMoney4[2] shl 4) + (arrMoney4[2] shr 4);
              arrMoney4[3] := (arrMoney4[3] shl 4) + (arrMoney4[3] shr 4);
    end;
      

  2.   

    Shr、Shl  逻辑运算符 分别执行右移, 左移
    Move 内存移动var
      cs1 : byte;
    begin
      cs1 := 250;//对应二进制1111 1010
      cs1 := (cs1 shl 4) + (cs1 shr 4); // 1010 0000 + 0000 1111 = 1010 1111 = 175
    end;
      

  3.   

    delphi与c基本一一对应
    只是操作符不使用特殊字符,而是改用单词
    shr >>
    shl <<
    xor ^
    not !还是~
    mod %move其实是内存块复制
      

  4.   

    多谢各位大神的指导。
    我主要是下面这句不明白:
    move(aMoney, arrMoney4, sizeof(aMoney)); //将aMoney的值放入arrMoney4将一个整型拷贝到byte数组中,值是怎么转换的呢?
    比如aMoney:=123000 的话。
      

  5.   

    procedure Move(const Source; var Dest; Count: Integer);move(aMoney,arrMoney[1],sizeof(aMoney));
      

  6.   

      aMoney:=123000;
      move(aMoney, arrMoney4, sizeof(aMoney));
      showmessage(inttostr(arrmoney4[0]));在第三条语句下断点,程序跑起来,鼠标移动到arrMoney4上就可以看见数组的值:(120,224,1,0),即($78, $E0, $1, $0).
    123000等于16进制的$0001E078。由于是Int64,内存中低4个字节是$0001E078,高4个字节是0.
    第2条move语句将aMoney的8个字节的内容拷贝到arrMoney4.而arrMoney4才4个字节,它得到aMoney的低4个字节的内容0001E078,高4个字节的内容覆盖到了arrMoney4的地址+4的位置sPayTimes。这溢出了,正确move的第3个参数应当是sizeof(arrMoney4)。