Lo、Hi、HiByte、LoWord、HiWord、MakeWord、MakeLong、Int64Rec
本话题会涉及到: Lo、Hi、HiByte、LoWord、HiWord、MakeWord、MakeLong、Int64Rec
譬如有一个 Cardinal 类型的整数: 1144201745
其十六进制的表示是: $44332211
其二进制表示是: 01000100 00110011 00100010 00010001
我们说 Cardinal 是 32 位的整数, 这里的位是指 "二进制的位数", 不信你数数.
我们需要重点面对的是十六进制, 不管是几进制的数在编译成汇编代码时都是用十六进制表示, 因为它最直观;
我们用十六进制来分析, 也是因为它的直观.
怎么直观的? Cardinal 有 32 位, 每 8 位一个字节, 共 4 个字节;
上面的例数分成字节就是: $44、$33、$22、$11, 这明显比二进制简洁、比十进制直观.
其中的 $11 是最低位的字节、$44 是最高位的字节(每字节对应十六进制的两位).
有时我们需要获取其中某个字节或某两个字节, 这虽然用位运算也不难, 但还是有了诸多函数:
Lo //获取例数中的 $11
Hi //获取例数中的 $22
LoWord //获取例数中的 $2211
HiWord //获取例数中的 $4433
其中的 Hi 好像有点费解, 为什么获取的不是 $44 而是 $22 呢?
这样理解吧: Hi 获取的是 Lo(获取)的上一个字节.
HiByte 和 Hi 基本一样, 如果参数是 16 位的 Word 类型, 用 HiByte 会更好些(中间会省去一个转换过程).
其中的 HiWord 是个函数, 但 LoWord 并不是个函数, 它是 Word 类型的重命名.
也就是说 LoWord(num) 等价于 Word(num), 这不是类型转换吗?
是的, 所以像 Lo(num) 也可以用 Byte(num) 来代替.
用代码总结一下:
var
num: Cardinal;
b1,b2,b3,b4: Byte;
w1,w2: Word;
begin
num := $44332211;
w1 := Word(num);
w2 := HiWord(num);
ShowMessageFmt('w1:%x; w2:%x', [w1,w2]);//w1:2211; w2:4433 b1 := Lo(num);
b2 := Hi(num);
b3 := Byte(w2);
b4 := HiByte(w2);
ShowMessageFmt('b1:%x; b2:%x; b3:%x; b4:%x', [b1,b2,b3,b4]);//b1:11; b2:22; b3:33; b4:44
end;
下一个话题: 我们有时也需要进行上面的反操作, 譬如:
把两个 Byte 合成为一个 Word;
把两个 Word 合成一个 Cardinal;
把两个 Cardinal 合成一个 Int64;
把四个 Byte 合成一个 Cardinal;
把四个 Word 合成一个 Int64 等等
上面说的 Cardinal 也可以是 Integer 或 DWORD.
完成这种工作也有不少函数:
MakeWord、MakeLong、MakeWParam、MakeLParam、MakeLResult、MAKELCID 等等.
仅就 MakeWord、MakeLong 举例:
var
num: Cardinal;
b1,b2,b3,b4: Byte;
w1,w2: Word;
begin
b1 := $11;
b2 := $22;
b3 := $33;
b4 := $44; w1 := MakeWord(b1, b2);
w2 := MakeWord(b3, b4);
ShowMessageFmt('w1:%x; w2:%x', [w1,w2]);//w1:2211; w2:4433 num := MakeLong(w1, w2);
ShowMessageFmt('num:%x', [num]);//44332211
end;
有没有把两个 Integer 合成为 Int64 的函数呢?
没有, 当然可以写一个; 不过有更方便的处理方式, 那就是 Int64Rec 结构.
举例如下:
var
n1,n2: Cardinal;
num64: Int64;
rec: Int64Rec;
begin
n1 := $44332211;
n2 := $AABBCCDD; rec.Lo := n1;
rec.Hi := n2; num64 := Int64(rec);
ShowMessage(IntToHex(num64, 0)); //AABBCCDD44332211
end;
Int64Rec 更多用于反向操作:
var
n1,n2: Cardinal;
num64: Int64;
begin
num64 := $AABBCCDD44332211; n1 := Int64Rec(num64).Lo; //或 n1 := Cardinal(num64);
n2 := Int64Rec(num64).Hi; ShowMessageFmt('n1:%x; n2:%x', [n1,n2]);//n1:44332211; n2:AABBCCDD
end;
转自:http://www.cnblogs.com/del/archive/2010/04/21/1717584.html#
Lo、Hi、HiByte、LoWord、HiWord、MakeWord、MakeLong、Int64Rec的更多相关文章
- /MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题
一.MD(d).MT(d)编译选项的区别 1.编译选项的位置 以VS2005为例,这样子打开: 1) 打开项目的Property Pages对话框 2) 点击左侧C/C ...
- c语言求平面上2个坐标点的直线距离、求俩坐标直线距离作为半径的圆的面积、递归、菲波那次数列、explode
#include <stdio.h> #include <math.h> #include <string.h> char explode( char * str ...
- ArcGIS Engine开发之旅07---文件地理数据库、个人地理数据库和 ArcSDE 地理数据库中的栅格存储加以比较 、打开栅格数据
原文:ArcGIS Engine开发之旅07---文件地理数据库.个人地理数据库和 ArcSDE 地理数据库中的栅格存储加以比较 .打开栅格数据 对文件地理数据库.个人地理数据库和 ArcSDE 地理 ...
- MySQL命名、设计及使用规范--------来自标点符的《MySQL命名、设计及使用规范》
原文地址:http://www.biaodianfu.com/mysql-best-practices.html 最近在看MySQL相关的内容,整理如下规范,作为一名刚刚学习MySQL的菜鸟,整理的内 ...
- javascript 常见数组操作( 1、数组整体元素修改 2、 数组筛选 3、jquery 元素转数组 4、获取两个数组中相同部分或者不同部分 5、数组去重并倒序排序 6、数组排序 7、数组截取slice 8、数组插入、删除splice(需明确位置) 9、数组遍历 10、jQuery根据元素值删除数组元素的方)
主要内容: 1.数组整体元素修改 2. 数组筛选 3.jquery 元素转数组 4.获取两个数组中相同部分或者不同部分 5.数组去重并倒序排序 6.数组排序 7.数组截取slice 8.数组插入.删除 ...
- Page11:状态反馈、输出反馈的概念及性能比较,极点配置的基本概念、意义及其算法[Linear System Theory]
内容包含离散时间线性时不变系统的稳定判据 状态反馈.输出反馈的基本概念及其性能比较 极点配置的基本概念.意义及其算法
- Java8获取当前时间、新的时间日期类如Java8的LocalDate与Date相互转换、ZonedDateTime等常用操作包含多个使用示例、Java8时区ZoneId的使用方法、Java8时间字符串解析成类
下面将依次介绍 Date转Java8时间类操作 ,Java8时间类LocalDate常用操作(如获得当前日期,两个日期相差多少天,下个星期的日期,下个月第一天等) 解析不同时间字符串成对应的Java ...
- 设a、b、c均是0到9之间的数字,abc、bcc是两个三位数,且有:abc+bcc=532。求满足条件的所有a、b、c的值。
题目描述 设a.b.c均是0到9之间的数字,abc.bcc是两个三位数,且有:abc+bcc=532.求满足条件的所有a.b.c的值. 输入描述: 题目没有任何输入. 输出描述: 请输出所有满足题目条 ...
- Vue(SPA) WebPack模块化打包、SEO优化(Vue SSR服务端同构直出)、全浏览器兼容完整解决方案
白驹过隙,时光荏苒 大概去年这个时候写了angular 结合webpack的一套前端方案,今年此时祭出vue2结合webpack的一套前端方案. 明年的这个时候我又是在做什么... 读在最前面: 1. ...
随机推荐
- vueHistory 模式下,布置到服务器上路由刷新会报nginx404错误
之前写完vue项目后,布置到服务器,用nginx反向代理后,一开始进去,进各种路由都是没问题的,但是一旦f5刷新后就会出现一个nginx404的错误. 经过翻阅vue文档后,发现这是vueHistor ...
- JS的函数参数传递为值传递
function setAge(i) { alert(i);//24 i = 18; alert(i);//18,i的改变不会影响外面的age }; var age = 24; setAge(age) ...
- Struts2_用ModelDriven接收参数
通过实现 ModelDriven 接口来接收请求参数,这种方法用的比较少,一般还是用前两种. 请求: <a href="user/user!add?name=xiaoer&ag ...
- html:<link> 标签中的 media 属性
HTML <link> 标签的 media 属性 定义和用法 media 属性规定被链接文档将显示在什么设备上. media 属性用于为不同的媒介类型规定不同的样式. media属性值 ( ...
- Centos 6.5_64bit 下安装 Zabbix server 3.0监控主机的加入
安装Zabbix server 3.0客户端之前需要先关闭selinux和打开10050和10051端口 关闭selinux 1 vi /etc/selinux/config 2 ...
- 笨办法学Python(三十一)
习题 31: 作出决定 这本书的上半部分你打印了一些东西,而且调用了函数,不过一切都是直线式进行的.你的脚本从最上面一行开始,一路运行到结束,但其中并没有决定程序流向的分支点.现在你已经学了 if, ...
- 如何在CRM WebClient UI里使用HANA Live Report
1. 使用业务角色ANALYTICSPRO登录SAP CRM WebClient UI: 点击新建按钮创建一个新的HANA live report: 类型选择SHL: 弹出窗口,维护report的名称 ...
- 动态原型模式 js
动态原型模式 function Person(name,age){ this.name = name; this.age = age; if(typeof this.sayName != " ...
- 自定义报告,用Java写一个html文件
因为testng不满足我们的展示,所以我们会自己定义一个报告,实施步骤是,把静态页面做好后,放在Java项目中,其实和生成一个日志文件类似,只是该了后缀,Java中需要使用到PrintStream,案 ...
- 高精度水题(POJ2109)
题目链接:http://poj.org/problem?id=2109 double 可以虽然可以表示10^-307~~~10^208,但是精确度只有16位,这个题有bug. #include < ...