找回密码
 加入
搜索
查看: 7735|回复: 12

[AU3基础] [已解决]请教pusofalse《au3之dllcall精讲》中关于十六进制(32位)运算的疑问

  [复制链接]
发表于 2014-6-5 22:08:13 | 显示全部楼层 |阅读模式
本帖最后由 cumtljj 于 2014-6-6 11:30 编辑

官方书籍第58页中有一点不懂的地方 想问问这个具体是什么运算规则呢?有明白的能具体说说么?谢谢

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2014-6-6 07:08:10 | 显示全部楼层
本帖最后由 seniors 于 2014-6-6 09:27 编辑

这个标题,照例我是不能回答的
P版比较高级,这个小问题我来回答一下吧
任何进制的运算和10进制是一样的
你就当是
$iVolume(10)=1234(10)
$iVolume(10) = $iVolume(10) * 10000(10) + $iVolume(10)结果就是12341234(10)
如果$iVolume是8进制
$iVolume(8) = $iVolume(8) * 10000(8) + $iVolume (8)结果就是 12341234(8)
如果$iVolume是32进制
$iVolume(32) = $iVolume(32) * 10000(32) + $iVolume (32)结果就是 12341234(32)

上式$iVolume(16) = $iVolume(16) * 10000(16) + $iVolume(16)如果改成
$iVolume(16) = $iVolume(16) * 10000(10) + $iVolume(16)结果就不同了
-----------------
编辑一下,少打了一个0

评分

参与人数 1金钱 +20 贡献 +2 收起 理由
tryhi + 20 + 2

查看全部评分

发表于 2014-6-6 08:37:04 | 显示全部楼层
本帖最后由 lanfengc 于 2014-6-6 08:52 编辑

回复 2# seniors
回复 1# cumtljj

如图: 不多说了.


顺便用C语言写了2行代码,希望你能够理解.

#cs
int iVolume=0x00001234;                                        
;C语言源码, 等义变量并初始化
0041140E  mov         dword ptr [iVolume],1234h                          
;对应的汇编代码    将1234h (后面带有h代表该数值为16进制数) 送入iVolume变量的内存区域中.
iVolume=iVolume*0x10000+iVolume;                        
;C语言代码  乘以0x10000  再加上自身
00411415  mov         eax,dword ptr [iVolume]                          
;对应的汇编代码  先将数值调入寄存器EAX
00411418  shl           eax,10h                                                                          
;EAX左移10h (也就是10进制的左移16位)  将原低16位的数值移位到高16为,低16为空出来置零
0041141B  add          eax,dword ptr [iVolume]                                                  
;EAX中的数值加上 iVolume变量存储区的数据 , 截个再放回EAX中.
0041141E  mov         dword ptr [iVolume],eax                                                  
;计算完成, 将EAX的数值写入到 iVolume 变量的内存区域.
#ce

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 1金钱 +20 贡献 +2 收起 理由
tryhi + 20 + 2

查看全部评分

 楼主| 发表于 2014-6-6 08:37:45 | 显示全部楼层
回复 2# seniors


    谢谢 我开始的时候是都转换成十进制后来也发现你说的类似的规律但是不知道是不是对
 楼主| 发表于 2014-6-6 09:02:58 | 显示全部楼层
回复 3# lanfengc


    谢谢
发表于 2014-6-6 09:29:46 | 显示全部楼层
回复 3# lanfengc

谁说au3没有移位操作的
$iVolume * 0x10000相当于BitShift($iVolume,-16)
$iVolume = $iVolume * 0x10000 + $iVolume相当于$iVolume = BitOR(BitShift($iVolume,-16), $iVolume)
发表于 2014-6-6 10:53:29 | 显示全部楼层
回复 6# seniors


    嗯 . 受教了,  忘记了bitshift这个函数.  
不过, 我说的移位是汇编里的左移,右移,循环左移,循环右移等指令, AU3只有 左移和右移. 我确实没有注意bitshift这个函数.

谢谢.
发表于 2014-6-6 11:29:08 | 显示全部楼层
回复 7# lanfengc
循环移位    BitRotate
 楼主| 发表于 2014-6-6 11:58:27 | 显示全部楼层
回复 [url=http://www.autoitx.cLocal $iBitRotate2 = BitRotate(1, -1) ; 1 = 0001b 右旋转一次 -> 32768 (32 位) = 1000 0000 0000 0000b
Local $iBitRotate2 = BitRotate(1, -1) ; 1 = 0001b 右旋转一次 -> 32768 (32 位) = 1000 0000 0000 0000b

    ; 显示结果.
    MsgBox($MB_SYSTEMMODAL, "", $iBitRotate2)

    ; 指定本地变量一个 14 的右旋转运算的结果.
    Local $iBitRotate3 = BitRotate(14, -2) ; 14 = 1110b 右旋转两次 -> 32771 (16 bits) = 1000 0000 0000 0011b

    ; 显示结果.
    MsgBox($MB_SYSTEMMODAL, "", $iBitRotate3)

    ; 分配本地变量一个 14 的 32 位按位右旋转运算.
    Local $iBitRotate4 = BitRotate(14, -2, "D")
    ; 14 = 1110b right-rotated twice -> -2147483645 (32 位) = 1000 0000 0000 0000 0000 0000 0000 0011b (第一位有符号)

    ; 显示结果.
    MsgBox($MB_SYSTEMMODAL, "", $iBitRotate4)
为什么$iBitRotate2转换后是32位 而$iBitRotate3却是16位的呢? 还有个问题就是$iBitRotate4怎么就有正负号了呢?  谢谢 这个问题纠结好久了
发表于 2014-6-6 12:24:03 | 显示全部楼层
我$iBitRotate2和$iBitRotate3结果都是16位
负号是au3的规定最高位表示正负
 楼主| 发表于 2014-6-6 12:36:23 | 显示全部楼层
回复 10# seniors


    -2147483645 (32 位) = 1000 0000 0000 0000 0000 0000 0000 0011b (第一位有符号)  哪个是第一位啊?最左边的1?
发表于 2014-6-6 12:49:58 | 显示全部楼层
最左边的1指负号
它= 负2^31-3
 楼主| 发表于 2014-6-6 16:04:08 | 显示全部楼层
回复 12# seniors
难道最左边的1既代表符号也能行进运算么?2^31完整的应该是1*2^31啊 还有就是为什么是-3而不是+3啊?
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-23 17:26 , Processed in 0.357527 second(s), 29 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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