• 从IntToHex()说起,栈/堆地址标准写法 good


    学习中的一些牢骚。栈/堆地址标准写法。

    我一直都在寻找各种业务功能的最简单写法,用减法的模式来开发软件。下面是我的写法,如果有更简单的方法,请留言告知。

    本人再学习的过程中,遇到很多难题,delphi很多地方自身的设计就很乱。
    比如对参数修饰符的理解,网上100篇文章 90篇都有问题 错误率非常高。delphi 的数据类型有很多
    同一个参数修饰符 修饰 不同数据类型 的意义都是有差异的。你或许认为你知道 传值与传址;
    传址 又可分2种情况,你可知道。


    再比如 把指针 转换成 16进制。网上有很多人的写法 都不是标准的。可以讨论下,我弄了一个标准的写法,兼容32位与64位。

    从IntToHex()说起,这个方法 官方设计时 是如何想的 我不懂;反正乱,这也是导致很多人 把指针转换成16 多种写法的主要原因。

    看下图 官方提供了 3个函数:

    你要知道 32位程序,指针是无符号32位的 即Cardinal 类型;64位是 UInt64 类型。

    官方上面三个函数中提供了 Uint64 入参,却没有提供Cardinal入参的重载。

    再看这三个函数的实现:

    你会发现第一个函数,Integer的这个 内部又转成了 Cardinal ,然后调用了_IntToHex ,而这个函数的入参是Uint64,所以又再次把Cardinal 转成了UInt64;折腾不折腾,多写一个函数会死啊;上面三个函数 都调用了 _IntToHex,我们接下来看这个函数;

    function _IntToHex(Value: UInt64; Digits: Integer): string;

    他的入参是 UInt64,所以说 上面三个IntToHex 最终都变成了UInt64;为什么最终 都用了 UInt64,我们要看这个函数的名字: IntToHex 意思是把整型转成16进制,而无符号64位 所能表达的范围最广,能兼容一切整型;即Int8、UInt8、Int32、UInt32(Cardinal)、Int64都能转换成 UInt64 而不溢出。

    罢了 罢了 不管官方的设计了,我们只能再官方的基础上 做我们想做的事:

    拿到栈中指针的地址与堆中数据的地址的标准写法是(谁不同意欢迎讨论):

    http://blog.qdac.cc/?p=4440
    https://sourceforge.net/projects/qdac/
     
    -------------------------------------------------------------------------------------
    再加上两句:
    Memo1.Lines.Add('堆中数据地址:' + IntToStr(Integer(Pointer(s))));

    Memo1.Lines.Add(Format('S[1]的地址: %p', [@S[1]]));
    Memo1.Lines.Add(Format('S[2]的地址: %p', [@S[2]]));

    Memo1.Lines.Add(Format('S[1]的地址: %d', [Integer(@S[1])]));
    Memo1.Lines.Add(Format('S[2]的地址: %d', [Integer(@S[2])]));

    输出结果:

    栈中指针地址:0019F4BC
    堆中数据地址:0044FD4C // 等于十进制 4521292

    堆中数据地址:4521340 // 为什么不等于上面那个值,而是相差了48个字节?
    S[1]的地址: 02242590
    S[2]的地址: 02242591
    S[1]的地址: 35923344 // 就是02242590的十进制
    S[2]的地址: 35923345 

    为什么s[1]的地址,和上面2个值(栈中指针和堆中数据)都没有关系?
    我觉得S字符串的内容,肯定在堆里啊,但是S[1]和堆里的地址不是连续的,这是怎么回事?

    你用 integer就是个错误
    你要知道 内存编号 是只有正数 何来负数
    为了兼容64位与32位 必须得用 64位无符号 整型
    64下 你用 integer就会 内存编号 过大的话 就会溢出

  • 相关阅读:
    C艹函数与结构体
    c++ const 用法总结
    c++ 重载
    c++ 的makefile文件实例
    python3 异步模块asyncio
    C++ 面向对象 类成员函数this指针
    基于注释的Spring Security实战
    web 安全 初探 (正在更新)
    Spring dbcp连接池简单配置 示例
    Spring JDBC
  • 原文地址:https://www.cnblogs.com/findumars/p/6430439.html
Copyright © 2020-2023  润新知