他们让我把一组字样表示成" map memory"。集合中有哪些字符?老师告诉我们使用ASCII码,一组32个字节。
A有这个例子,集合{' A',' B'' C'}
(7来自0111)
= {00 00 00 00 00 00 00 70 00 00 00 00 00 00 00 00 00 00 00 00}
答案 0 :(得分:6)
pascal中的集合可以在内存中表示,每个元素都有一位;如果该位为1,则该元素存在于该集合中。
“set of char”是ascii char的集合,其中每个元素的序数值从0到255(ascii应为127,但通常这个集合扩展到一个字节,因此有256个不同的人物)。
因此,“char集”在存储器中表示为32字节的块,其包含总共256位。字符“A”(大写字母A)的序数值为65. 65乘8的整数除法(一个字节可以容纳的位数)得到8.因此表示集合中“A”的位位于字节编号8. 65 mod 8给出1,这是该字节中的第二位。
字节编号8将使字符A的第二位为ON(B的第三位为C,第四位为C)。所有三个字符一起给出了二进制表示0000.1110(十六进制为$ 0E)。
为了证明这一点,我尝试使用turbo pascal进行以下程序:
var
ms : set of char;
p : array[0..31] of byte absolute ms;
i : integer;
begin
ms := ['A'..'C'];
for i := 0 to 31 do begin
if i mod 8=0 then writeln;
write(i,'=',p[i],' ');
end;
writeln;
end.
由于“absolute”关键字,程序打印集合中所有32个字节的值。其他版本的pascal可以使用不同的方法来完成。运行程序会得到以下结果:
0=0 1=0 2=0 3=0 4=0 5=0 6=0 7=0
8=14 9=0 10=0 11=0 12=0 13=0 14=0 15=0
16=0 17=0 18=0 19=0 20=0 21=0 22=0 23=0
24=0 25=0 26=0 27=0 28=0 29=0 30=0 31=0
你看到唯一不同于0的字节是字节数8,它包含14(十六进制的$ 0E,0000.1110)。所以,你的猜测(70)是错误的。
那就是说,我必须补充一点,没有人可以说这总是正确的,因为pascal中的一个集合是依赖于实现的;所以你的答案也可能是正确的。 turbo pascal(在dos / windows上)使用的表示是最合乎逻辑的,但这并不排除其他可能的表示。