Byte 和 Word 这两个数据类型,都是无符号整数,详情如下:
| 数据类型 | 字节 | 位数 | 取值范围 |
|---|---|---|---|
| Byte | 1 | 8 | 0 ~ 255 |
| Word | 2 | 16 | 0 ~ 65535 |
之所以会用到这两个数据类型,是因为公司有个项目,需要读写寄存器中的数据,该寄存器两个字节,分为高八位和低八位。
获取数据时,调用了硬件厂家的API函数,它使用C语言编写。
获取寄存器数据时,它定义了一个Byte数组Byte value[2]来分别获取高八位和低八位的数据,最后使用MakeWord函数拼接在一起。
正好,Delphi 7中也有这个函数,我们来看看具体内容:
function MakeWord(A, B: Byte): Word;
begin
Result := A or B shl 8;
end;
其实我不太清楚or和shl哪个优先级高,但是可以判断下,shl是向左移位。
- 如果
or优先级高,那么A和B先进行或运算,那么这就不是高八位与低八位的拼接了,因为或运算破坏了A和B的值。 - 如果
shl优先级高,那么B先向左移八位,尾部补八个零,再进行或运算,相当于A全部成了B的低八位,这样结果就是一个Word,完美,不过还得实际运行下。
var
bh, bl: Byte;
w: Word;
begin
bh:= 1; {00000001,1}
bl:= 2; {00000010,2}
w:= MakeWord(bl, bh); {1 0000 0010,258}
end;
事实证明以上猜想正确,其正确用法为MakeWord(低八位, 高八位)。
※备注一:运算符or的用法
{******************
and:按位与
or :按位或
******************}
var
i, j, m, n: Integer;
begin
i:= 1; {01,1}
j:= 2; {10,2}
m:= i and j; {00,0}
n:= i or j; {11,3}
end;
※备注二:运算符shl的用法
{******************
shr:二进制数向右移位,首部补零,相当于乘以 2的 n次方
shl:二进制数向左移位,尾部补零,相当于除以 2的 n次方
******************}
var
x, y, z1, z2, n: Integer;
begin
n:= 1;
x:= 1; {01,1}
y:= 2; {10,2}
x:= x shl n; {10,2}
y:= y shr n; {01,1}
z1:= 12; {01100,12}
z2:= 12;
z1:= z1 shl n; {11000,24}
z2:= z2 shr n; {00110,6}
end;









网友评论