计算一个记录体的2进制加法和

oolong 2008-07-17 07:57:15
求助

比如

BAK_SYSTEM = record
s_mark1: Char; ='A' 2进制为 $65
s_mark2: Word; =300 2进制为 $01 $2C
s_check: Byte; =12 2进制为 $12

要计算出 $65+$01+$2C+$12 的和 ;

任意一种记录的按一个一个字节计算一个2进制加法和;

谢谢
...全文
130 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
scarsty 2008-07-20
  • 打赏
  • 举报
回复
如果没用packed,有什么办法吗
JeffChung 2008-07-18
  • 打赏
  • 举报
回复
阿发伯的说法好像反了。

Record的数据各个字节都是对齐的,数据格式比较完整,所以这种格式相对packed占用的内存比较大,
但是因为格式比较整齐,所以电脑读取这个类型的数据的时候速度比较快。

而Packed Record对数据进行了压缩,节省了内存空间,当然他的速度也变的慢了。

type
myrec = packed record
n1 : integer; // 4个字节
n2 : shortint; // 1个字节
end;
sizeof(myrec) ------ 5

type
myrec = record
n1 : integer;
n2 : shortint;
end;
sizeof(myrec) ------ 8
JeffChung 2008-07-18
  • 打赏
  • 举报
回复
额,看了9楼的话,明白阿发伯的意思了。

我理解错了,sorry to 阿发伯
gzmhero 2008-07-18
  • 打赏
  • 举报
回复
如4楼所说,如果没加packed关键字可能会有错误,record空间的有未使用的地址,随机的数据。
如果把myrecord1定义成全局变量,未使用的空间初始化成0,则结果是对的,而定义成函数的内部变量,则不会初始化,结果是错误的。
jacknes009 2008-07-18
  • 打赏
  • 举报
回复
恩。是这样的。。存储结构的问题。。。
阿发伯 2008-07-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 JeffChung 的回复:]
阿发伯的说法好像反了。

Record的数据各个字节都是对齐的,数据格式比较完整,所以这种格式相对packed占用的内存比较大,
但是因为格式比较整齐,所以电脑读取这个类型的数据的时候速度比较快。

而Packed Record对数据进行了压缩,节省了内存空间,当然他的速度也变的慢了。

type
myrec = packed record
n1 : integer; // 4个字节
n2 : shortint; // 1个字节
end;
sizeof(m…
[/Quote]
楼上请注意我的说法是针对2楼的例子:用PByte指针计算record的字节和!而你的例子说明我前面说的话是完全正确的,2楼的方法对packed record无疑是可行的,但是对于你的第二个记录,就可能不正确了。
阿发伯 2008-07-17
  • 打赏
  • 举报
回复
修正一下说法:“否则计算结果会不正确”修正为“否则计算结果可能会不正确”。
阿发伯 2008-07-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 scarsty 的回复:]
Delphi(Pascal) code

p: PByte;
s: integer;
......


s:=0;
p:=@myrecord1;
for i:=0 to sizeof(bak_system)-1 do
begin
s:=s+p^;
inc(p);
end;





差不多是这么回事。
[/Quote]

记录类型必须是以字节对齐的前提下,才能用这样计算。也就是说,必须是BAK_SYSTEM = packed record形式或者设置了字节对齐编译指令,否则计算结果会不正确。
JeffChung 2008-07-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 scarsty 的回复:]
Delphi(Pascal) code

p: PByte;
s: integer;
......


s:=0;
p:=@myrecord1;
for i:=0 to sizeof(bak_system)-1 do
begin
s:=s+p^;
inc(p);
end;


差不多是这么回事。
[/Quote]

楼上厉害
scarsty 2008-07-17
  • 打赏
  • 举报
回复


p: PByte;
s: integer;
......


s:=0;
p:=@myrecord1;
for i:=0 to sizeof(bak_system)-1 do
begin
s:=s+p^;
inc(p);
end;



差不多是这么回事。
oolong 2008-07-17
  • 打赏
  • 举报
回复
求助

比如

BAK_SYSTEM = record
s_mark1: Char; ='A' 2进制为 $65
s_mark2: Word; =300 2进制为 $01 $2C
s_check: Byte; =12 2进制为 $12

要计算出 $65+$01+$2C+$12 的和 ;

求任意一种记录的按一个一个字节计算相加的和;

谢谢

16,749

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧