Delphi 7:数据类型 Byte 和 Word
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;
好的代码像粥一样,都是用时间熬出来的