首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

Delphi基础Move、Shr、Shl等,帮忙解答这段代码的意义

2013-08-23 
Delphi基础Move、Shr、Shl等,帮忙解答这段代码的意思Delphi基础不够扎实,上来求大神解答,以下代码的意思:var

Delphi基础Move、Shr、Shl等,帮忙解答这段代码的意思
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;
Delphi sizeof Move? shr??shl
------解决方案--------------------



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;

[解决办法]
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;
[解决办法]
delphi与c基本一一对应
只是操作符不使用特殊字符,而是改用单词
shr >>
shl <<
xor ^
not !还是~
mod %

move其实是内存块复制
[解决办法]
  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)。

热点排行