Delphi基础Move、Shr、Shl等,帮忙解答这段代码的意思
Delphi基础不够扎实,上来求大神解答,以下代码的意思:
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));
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;
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;
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)。