cumtljj 发表于 2014-6-5 22:08:13

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

本帖最后由 cumtljj 于 2014-6-6 11:30 编辑

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

seniors 发表于 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

lanfengc 发表于 2014-6-6 08:37:04

本帖最后由 lanfengc 于 2014-6-6 08:52 编辑

回复 2# seniors
回复 1# cumtljj

如图: 不多说了.


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

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

cumtljj 发表于 2014-6-6 08:37:45

回复 2# seniors


    谢谢 我开始的时候是都转换成十进制后来也发现你说的类似的规律但是不知道是不是对

cumtljj 发表于 2014-6-6 09:02:58

回复 3# lanfengc


    谢谢

seniors 发表于 2014-6-6 09:29:46

回复 3# lanfengc

谁说au3没有移位操作的
$iVolume * 0x10000相当于BitShift($iVolume,-16)
$iVolume = $iVolume * 0x10000 + $iVolume相当于$iVolume = BitOR(BitShift($iVolume,-16), $iVolume)

lanfengc 发表于 2014-6-6 10:53:29

回复 6# seniors


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

谢谢.

seniors 发表于 2014-6-6 11:29:08

回复 7# lanfengc
循环移位    BitRotate

cumtljj 发表于 2014-6-6 11:58:27

回复 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怎么就有正负号了呢?谢谢 这个问题纠结好久了

seniors 发表于 2014-6-6 12:24:03

我$iBitRotate2和$iBitRotate3结果都是16位
负号是au3的规定最高位表示正负

cumtljj 发表于 2014-6-6 12:36:23

回复 10# seniors


    -2147483645 (32 位) = 1000 0000 0000 0000 0000 0000 0000 0011b (第一位有符号)哪个是第一位啊?最左边的1?

seniors 发表于 2014-6-6 12:49:58

最左边的1指负号
它= 负2^31-3

cumtljj 发表于 2014-6-6 16:04:08

回复 12# seniors
难道最左边的1既代表符号也能行进运算么?2^31完整的应该是1*2^31啊 还有就是为什么是-3而不是+3啊?
页: [1]
查看完整版本: [已解决]请教pusofalse《au3之dllcall精讲》中关于十六进制(32位)运算的疑问