--------------------------------------------------
var
I1, I2: Integer;
b: Boolean;
wb: WordBool;
lb: LongBool;
begin
I1 := $FF00;
b := I1 <> 0; //b = ?
b := Boolean(I1); //b = ?
b := WordBool(I1); //b = ?
b := LongBool(I1); //b = ? I2 := $FFFF0000;
lb := LongBool(I2); //lb = ?
wb := WordBool(I2); //wb = ?
wb := WordBool(lb); //wb = ?
end;
原因:结论:---------------------------------------------------请填写上面问号的值,并写出原因和结论,答对有奖哦!!!
var
I1, I2: Integer;
b: Boolean;
wb: WordBool;
lb: LongBool;
begin
I1 := $FF00;
b := I1 <> 0; //b = ?
b := Boolean(I1); //b = ?
b := WordBool(I1); //b = ?
b := LongBool(I1); //b = ? I2 := $FFFF0000;
lb := LongBool(I2); //lb = ?
wb := WordBool(I2); //wb = ?
wb := WordBool(lb); //wb = ?
end;
原因:结论:---------------------------------------------------请填写上面问号的值,并写出原因和结论,答对有奖哦!!!
False < True False <> True
Ord(False) = 0 Ord(False) = 0
Ord(True) = 1 Ord(True) <> 0
Succ(False) = True Succ(False) = True
Pred(True) = False Pred(False) = True
A value of type ByteBool, LongBool, or WordBool is considered True when its ordinality is nonzero. If such a value appears in a context where a Boolean is expected, the compiler automatically converts any value of nonzero ordinality to True.
The previous res refer to the ordinality of Boolean values, not to the values themselves. In Delphi, Boolean expressions cannot be equated with integers or reals. Hence, if X is an integer variable, the statementif X then ...;generates a compilation error. Casting the variable to a Boolean type is unreliable, but each of the following alternatives will work.if X <> 0 then ...; { use longer expression that returns Boolean value }
var OK: Boolean { use Boolean variable }
...
if X <> 0 then OK := True;
if OK then ...;
2字节 WordBool
4字节 BOOL,LongBool
大家似乎没有我的意思,我是想让大家填写各个表达式计算出来的布尔值。
I1, I2: Integer;
b: Boolean;
wb: WordBool;
lb: LongBool;
begin
I1 := $FF00;
b := I1 <> 0; //b = true
b := Boolean(I1); //b = false
b := WordBool(I1); //b = true
b := LongBool(I1); //b = true I2 := $FFFF0000;
lb := LongBool(I2); //lb = true
wb := WordBool(I2); //wb = false
wb := WordBool(lb); //wb = true
end;在电脑上试了一下。
我这么理解:
1.强制类型转换,字节数不等,将截断高字节
如:
I1 := $FF00;
b := Boolean(I1); //b = false
截断后Boolean(I1);值为$00; I2 := $FFFF0000;
wb := WordBool(I2); //wb = false
截断后WordBool(I2); 值为$0000;
2.布尔型的值
I2 := $FFFF0000;
lb := LongBool(I2);
用 showmessage(inttostr(integer(lb)));可以看到其值仍为$FFFF0000;
3.字节数不同的布尔型之间的强制转换
应该是为了保证语意逻辑上的一致,换句话说,一个true值的布尔型,不管你转成哪种布尔型,它都应该是true。而按上面两条,将有可能破坏这个逻辑。因此,在转换后采用了特定的值,即0,1或0,-1
0,1用于boolean型
0,-1用于WordBool及LongBool
因此,
I2 := $FFFF0000;
lb := LongBool(I2);
wb := WordBool(lb); //LongBool强制转换成WordBool,其值为-1
chijingde(AD): 顶得这么辛苦:20分 ^_~