一组字符在 PASCAL 中的表示是什么?
What's the representation of a set of char in PASCAL?
他们要求我将一组字符重新设置为 "map memory"。集合中有哪些字符?老师叫我们用ASCII码,变成一组32个字节。
A有这个例子,集合{'A', 'B', 'C'}
(7来自0111)
= {00 00 00 00 00 00 00 00 70 00
00 00 00 00 00 00 00 00 00 00
00}
pascal 中的集合可以在内存中用每个元素一位表示;如果该位为 1,则该元素存在于集合中。
一个"set of char"是ascii char的集合,其中每个元素都有一个从0到255的序数值(ascii应该是127,但通常这个集合扩展到一个字节,所以有是 256 个不同的字符)。
因此,"set of char" 在内存中表示为一个 32 字节的块,总共包含 256 位。字符 "A"(大写 A)的序数值为 65。65 除以 8(一个字节可以容纳的位数)得到 8。所以表示 "A" 的位在set 驻留在字节号 8 中。65 mod 8 给出 1,这是该字节中的第二位。
对于字符 A,字节号 8 的第二位为 ON(对于 B,第三位为 ON,对于 C,第四位为 ON)。所有三个字符一起给出 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.
程序打印集合中所有 32 个字节的值,这要归功于 "absolute" 关键字。其他版本的 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 上)使用的表示法是最合乎逻辑的,但这并不排除其他可能的表示法。
他们要求我将一组字符重新设置为 "map memory"。集合中有哪些字符?老师叫我们用ASCII码,变成一组32个字节。
A有这个例子,集合{'A', 'B', 'C'}
(7来自0111)
= {00 00 00 00 00 00 00 00 70 00 00 00 00 00 00 00 00 00 00 00 00}
pascal 中的集合可以在内存中用每个元素一位表示;如果该位为 1,则该元素存在于集合中。
一个"set of char"是ascii char的集合,其中每个元素都有一个从0到255的序数值(ascii应该是127,但通常这个集合扩展到一个字节,所以有是 256 个不同的字符)。
因此,"set of char" 在内存中表示为一个 32 字节的块,总共包含 256 位。字符 "A"(大写 A)的序数值为 65。65 除以 8(一个字节可以容纳的位数)得到 8。所以表示 "A" 的位在set 驻留在字节号 8 中。65 mod 8 给出 1,这是该字节中的第二位。
对于字符 A,字节号 8 的第二位为 ON(对于 B,第三位为 ON,对于 C,第四位为 ON)。所有三个字符一起给出 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.
程序打印集合中所有 32 个字节的值,这要归功于 "absolute" 关键字。其他版本的 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 上)使用的表示法是最合乎逻辑的,但这并不排除其他可能的表示法。