我是刚学Delphi不久,在自学到数据类型,有一个程序的其中一个语句看不懂,请各界高手给予小弟一点提示!
var
  c:Char;begin
  c:=High(Char);
  Inc(c,70);
  WriteLn(c);
  WriteLn(Pred(c));
  WriteLn(Succ(c));
  ReadLn;
end.
将c定义为Char后,将ASCII字符型的最大值255赋给字符变量c,然后Inc(c,70)这个语句是将变量c的值加上70,为什么c的值是69,而不是255+70的值呢?上面的程序我是根据Delphi基础教程里面写出来的。
以上的程序得出的结果是:
E
D
F

解决方案 »

  1.   

    我刚才再看一次上面的程序,得到以下的个人看法:
    c:=High(Char); 这段语句只是将ASCII字符型的最大值255赋给字符变量c,而不是c真正的值,只是代表c取值范围在0到255之间,然后Inc(c,70)这个语句是将变量c的值加上70,因变量c保存的是单字节无符号整数值,所以c的取值范围由0到255变为0到69,所以c的实际值是69。
    以上是个人重新看一次代码时,所猜测的观点,如果有更好的观点,请高手指点一下!
      

  2.   

    var 
        c:Char; begin 
        c:=High(Char); //这里把#255赋给c
        Inc(c,70);    //由于c是单字节数据,数据范围是#0..#255,数据溢出 所以c变成(255+70) mod 256 [69]
        WriteLn(c); 
        WriteLn(Pred(c)); 
        WriteLn(Succ(c)); 
        ReadLn; 
    end. 
      

  3.   

    楼主应当看看什么是数据类型值的"回绕"特性.
    简单地说:
    char类型数据其范围是一个byte.也就是0..255;
    若有变量a:char;则a能存储的值范围是:0..255;
    如果你给A赋值为255,则A的值对应的二进制码为:11111111(0xFF);
    此时,你再将A加1时,通过运算,得到会的值就应当是256(0x100);其二进制表示为000100000000;
    要保存这个数据,实际上就要大于一个字节的空间了,但你定义的变量A,只有一个字节,此时写入数据时,会有什么情况呢?
    实际上,二制过数据写入时,是从低位向高位进行数据位的移动的,
    如果数据发生溢出,最高位的数据位就被“切”除了。因此,最后保存的数据就是00000000;前面的0001就是被切除的部份。
    因此最后的值就是0(0x00);指定数据类型的变量的值因此由最大值,变成了该数据类型值的最小值,
    从我们的角度来看,就是“回绕”了。(从终点又回到起点)
    相同的示例,可以参考汽车的里程表!或是电表的计数器