我是刚学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
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
c:=High(Char); 这段语句只是将ASCII字符型的最大值255赋给字符变量c,而不是c真正的值,只是代表c取值范围在0到255之间,然后Inc(c,70)这个语句是将变量c的值加上70,因变量c保存的是单字节无符号整数值,所以c的取值范围由0到255变为0到69,所以c的实际值是69。
以上是个人重新看一次代码时,所猜测的观点,如果有更好的观点,请高手指点一下!
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.
简单地说:
char类型数据其范围是一个byte.也就是0..255;
若有变量a:char;则a能存储的值范围是:0..255;
如果你给A赋值为255,则A的值对应的二进制码为:11111111(0xFF);
此时,你再将A加1时,通过运算,得到会的值就应当是256(0x100);其二进制表示为000100000000;
要保存这个数据,实际上就要大于一个字节的空间了,但你定义的变量A,只有一个字节,此时写入数据时,会有什么情况呢?
实际上,二制过数据写入时,是从低位向高位进行数据位的移动的,
如果数据发生溢出,最高位的数据位就被“切”除了。因此,最后保存的数据就是00000000;前面的0001就是被切除的部份。
因此最后的值就是0(0x00);指定数据类型的变量的值因此由最大值,变成了该数据类型值的最小值,
从我们的角度来看,就是“回绕”了。(从终点又回到起点)
相同的示例,可以参考汽车的里程表!或是电表的计数器