1

他们要求我将一组字符表示为“映射内存”。集合中有哪些字符?老师告诉我们用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}

4

1 回答 1

6

pascal 中的集合可以在内存中表示为每个元素一个位;如果该位为 1,则该元素存在于集合中。

“字符集”是 ascii char 的集合,其中每个元素都有一个从 0 到 255 的序数值(ascii 应该是 127,但通常这个集合会扩展到一个字节,因此有 256 个不同的字符) .

因此,“字符集”在内存中表示为一个 32 字节的块,总共包含 256 位。字符“A”(大写字母 A)的序数值为 65。65 除以 8(一个字节可以容纳的位数)的整数除以 8。因此在集合中表示“A”的位位于字节数 8。65 mod 8 给出 1,这是该字节中的第二位。

字节数 8 将具有字符 A 的第二位(第三位为 B,第四位为 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上)使用的表示是最合乎逻辑的,但这并不排除其他可能的表示。

于 2017-03-18T06:49:28.547 回答