PASCAL中一组char的表示形式是什么?

Cth*_*lhu 1 memory pascal set char data-representation

他们让我把一组字样表示成"地图记忆".集合中有哪些字符?老师告诉我们使用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}

lin*_*fan 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.
Run Code Online (Sandbox Code Playgroud)

由于"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  
Run Code Online (Sandbox Code Playgroud)

你看到唯一不同于0的字节是字节数8,它包含14(十六进制的$ 0E,0000.1110).所以,你的猜测(70)是错误的.

也就是说,我必须补充一点,没有人可以说这总是正确的,因为pascal中的一个集合依赖于实现; 所以你的答案也可能是正确的.turbo pascal(在dos/windows上)使用的表示是最合乎逻辑的,但这并不排除其他可能的表示.