找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6158|回复: 0
打印 上一主题 下一主题
收起左侧

VBA 中的无符号整数问题

[复制链接]
跳转到指定楼层
楼主
ID:89763 发表于 2015-9-13 15:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
因测试需要,我做了Excel的VBA中做了一个小的转换工具,把一个用C语言格式表示的十六进制数 0xXXX,转换为用VBA语言表示的&HXXXX的表示方法,并且做几个移位的动作。只是没想到,这么一个简单的事情,在VBA中遇到了不少的麻烦。就在这里简单的说明一下:

1. 字符串求值函数 val() 的结果范围只是16位整数,虽然帮助文件中写的是8字节的6进制范围。例如:
    Debug.print VAL(“&H8C48”)结果是 : -29624
2. Hex 转换函数,正负数的处理结果不理想。这样把一个无符号整数,变成了32位负数。
   debug.print Hex(VAL("&H8C48")) 结果是:FFFF8C48

那么,如何获取正确的长整数结果呢?只能通过定义长整型变量,对这个16位数先转换为负数,在求补码的方式进行调整了。算法如下:
dim n as long  ‘如果定义为 Integer ,就会遭遇溢出错误
n=val("&H8C48")    ’此时结果为 n=-29624,是因为 val 函数的范围是16位
n=n+&H10000      '求负数的16位补码, n=35912
‘此时在用Hex函数,可以获取正确的十六进制结果
debug.print hex(n) -->结果为8C48

3. 以&HXXXX形式表示的十六进制立即数的使用,如果第一位是8XXX,则同样会认定为负数。示例如下:
    dim m as long
    m=1
    if m>= &H8000 then m=m-&H8000
    debug.print m
   此时,m的值应该是多少呢?
  你或许想得到的值是 m=1,实际上,你的m值是 32769(&H8001)
  如何修改呢? 把 &H8000 拆分为 &H7FFF +1,语句变化为:
  if m>&H7FFF then m=m-&H7FFF-1
   这时你就可以得到你想要的结果了。

如果能够直接使用无符号整数,或者能够说明十六进制的立即数的类型属于长整数型,都不会存在这样的麻烦了。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表