变体结构也就是变体记录, 是一个比较复杂的概念. 专家不提倡使用.
兴趣所致, 我想把它弄明白.

一个最大的无符号整数(Cardinal)是 4294967295, 它的大小是 4 字节, 它的二进制表示是:
11111111 11111111 11111111 11111111

它的低字节的值是 11111111, 也就是十进制的 255

//测试:
varc: Cardinal;
beginc := 4294967295;ShowMessage(IntToStr(Lo(c))); {会显示: 255; Lo 是获取低字节值的函数}
end;

一个 Byte 类型的最大值是 255, 它的大小是 1 个字节, 用二进制表示是:
11111111

假如把一个 Cardinal 类型的值赋给一个 Byte 类型的值, Byte 将只取 Cardinal 的最低字节.

//测试:
varc: Cardinal;b: Byte;
beginc := 4294967295;b := c;ShowMessage(IntToStr(b)); {255}c := 258; {二进制表示: 00000000 00000000 00000001 00000010}b := c;   {b 将只获取: 00000010}ShowMessage(IntToStr(b)); {2}
end;

这是我们能否会想到, 在结构会储存时, 一个可以储存 Cardinal 的空间, 当然也能得放下一个 Byte 值;
如果这个值非此即彼, 我们完全不需要两个储存空间.
我猜测, 这应该是 Delphi 设计变体记录的初衷.


//假如有这样一个员工登记表
typeTpersonRec = recordID: Integer;            {员工编号}case Boolean of         {根据分类}True:  (A: Cardinal); {如果是股东, 登记年薪}False: (B: Word);     {如果不是,   登记日薪}end;
varpersonRec: TpersonRec;
begin{先算一算这个结构的大小:ID 是 Integer  类型, 应该是   4  字节大小;A  是 Cardinal 类型, 也应该是 4  字节大小;B  是 Word     类型, 应该是   2  字节大小;合计为                        10 个字节.}{可事实, TpersonRec 只有 8 个字节}ShowMessage(IntToStr(SizeOf(TpersonRec))); {8}{原因是: 字段 A 和 字段 B 公用了一个储存空间;当然这个储存空间得依着大的, 是 Cardinal 的尺寸 4 个字节.}//赋值测试:personRec.ID := 110;personRec.A  := 100000; {一看就知道是个股东}//取值:ShowMessage(IntToStr(personRec.A)); {100000; 这不可能有错, 十万大洋}//但是:ShowMessage(IntToStr(personRec.B)); {34464 ?! 难道这是工人的日薪吗?}{首先, A 和 B 两个字段占用同一个空间, 给其中一个赋值, 另一个当然也就有值了;但因为数据类型的容量不同, 它们的值有可能是不一样的.在很多情况下, 我们可能根本不去理会另一个值, 但如果的确需要呢?看下一个例子:}
end;typeTpersonRec = recordID: Integer;case tag: Boolean of    {在这里加了一个 tag 变量}True:  (A: Cardinal);False: (B: Word);end;
varpersonRec: TpersonRec;
begin{我们可以用 tag 变量来区分, 记录中变体部分的值到底是谁的, 譬如:}personRec.ID  := 110;personRec.tag := True;personRec.A   := 100000; {股东的的年薪}personRec.ID  := 111;personRec.tag := False;personRec.B   := 100;    {工人的日薪}
end;//最经典的变体结构莫过于 Delphi 定义的 TMessage 结构了, 两组数据分分合合都是一体, 多么巧妙啊!
TMessage = packed recordMsg: Cardinal;case Integer of0: (WParam: Longint;LParam: Longint;Result: Longint);1: (WParamLo: Word;WParamHi: Word;LParamLo: Word;LParamHi: Word;ResultLo: Word;ResultHi: Word);end;

本话题暂时到这吧. 另参见: 再说变体结构


学习结构[记录]类型(9) - 变体结构相关推荐

  1. 再说变体结构 - 回复 彬 的问题

    问题来源: http://www.cnblogs.com/del/archive/2009/03/01/1032376.html#1464477 假如有这样三种结构, 分别来描述: 直线.圆与三角形: ...

  2. C语言结构体实验总结体会,iOS 学习心得记录之:C语言结构体定义的六中模式

    #include int main(int argc, const char * argv[]) { //第1种,匿名结构体,不需要结构体名,只需要结构体变量,只使用一次. struct { char ...

  3. 学习结构[记录]类型(8) - 结构嵌套

    为什么80%的码农都做不了架构师?>>>    unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Clas ...

  4. 学习结构[记录]类型(7) - 结构也可以有构造函数

    为什么80%的码农都做不了架构师?>>>    unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Clas ...

  5. ResNet及其变体结构梳理与总结

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 [导读]2020年,在各大CV顶会上又出现了许多基于ResNet改 ...

  6. PLSQL 之类型、变量和结构

    1.类型 在<.Net程序员学用Oracle系列(5):三大数据类型>一文中详细地讲述了 Oracle 的基本数据类型,文中还提到,除基本数据类型之外,Oracle 还在语法上支持一些非固 ...

  7. Delphi【变体记录及存储方式】

    DELPHI中记录的存储方式 在DELPHI中,我们用record关键字来表明一个记录,有时候,我们还会看到用packed record来声明的记录,这二者的区别就在于存储方式的不同:在windows ...

  8. VARIANT变体类型数据

    2019独角兽企业重金招聘Python工程师标准>>> 特殊 Variant 是一种特殊的数据类型,除了定长String数据及用户定义类型外,可以包含任何种类的数据.Variant ...

  9. 基于深度学习的目标检测综述(单阶段、多阶段、FPN变体、旋转目标检测等)

    随着深度学习的发展,基于深度学习的目标检测方法因其优异的性能已经得到广泛的使用.目前经典的目标检测方法主要包括单阶段(YOLO.SSD.RetinaNet,还有基于关键点的检测方法等)和多阶段方法(F ...

最新文章

  1. 《Gpu Gems》《Gpu Pro》《Gpu Zen》资源收集
  2. html5基础知识点常用标签
  3. orgman set触发的pricing set创建逻辑
  4. 马云最怕的事还是来了,央行对借呗动真格!
  5. 如何在Java中使用QRGen创建QRCode
  6. c语言程序设计实践教程课,C语言程序设计实践训练教程
  7. SLAM学习策略和前期准备
  8. 一个热词推荐的简单实现
  9. 未来计算机对世界的改变,到2030年,世界将会发生的10个改变,科学家:科技决定未来!...
  10. 机器学习人才的职业薪酬也发展
  11. 各种接口的硬盘在linux中的文件名
  12. 43.Linux/Unix 系统编程手册(下) -- 进程间通信简介
  13. c 语言tcp实现电子词典项目
  14. c语言餐厅饭卡管理系统,饭卡管理系统
  15. AStar算法通用实现+可视化(Matlab)
  16. WORD中设置“选择性粘贴“—“无格式文本”的快捷键
  17. 37.softmax多元逻辑回归
  18. 〖Python 数据库开发实战 - MySQL篇㉒〗- 子查询的语法规则
  19. Android 4.0模拟器弹出---“谷歌拼音输入法”已停止运行的解决方法
  20. oracle11g服务器端卸载,Oracle11G卸载教程

热门文章

  1. POI按照源单元格设置目标单元格格式
  2. 使用cpau.exe让不是管理员的用户也有权限运行哪些需要管理员权限的软件。
  3. C++/C的文件结构
  4. Tungsten Fabric SDN — 与 OpenStack 的集成架构
  5. 分布式任务队列 Celery — 应用基础
  6. print格式化输出,以及使用format控制
  7. python使用笔记:sys.argv[]的使用
  8. 伺服电机、舵机、步进电机的区别
  9. NR 5G 运营发布
  10. mysql数据库优化课程---15、mysql优化步骤(mysql中最常用最立竿见影的优化是什么)...