[已解决]请教pusofalse《au3之dllcall精讲》中关于十六进制(32位)运算的疑问
本帖最后由 cumtljj 于 2014-6-6 11:30 编辑官方书籍第58页中有一点不懂的地方 想问问这个具体是什么运算规则呢?有明白的能具体说说么?谢谢
本帖最后由 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: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
回复 2# seniors
谢谢 我开始的时候是都转换成十进制后来也发现你说的类似的规律但是不知道是不是对 回复 3# lanfengc
谢谢 回复 3# lanfengc
谁说au3没有移位操作的
$iVolume * 0x10000相当于BitShift($iVolume,-16)
$iVolume = $iVolume * 0x10000 + $iVolume相当于$iVolume = BitOR(BitShift($iVolume,-16), $iVolume) 回复 6# seniors
嗯 . 受教了,忘记了bitshift这个函数.
不过, 我说的移位是汇编里的左移,右移,循环左移,循环右移等指令, AU3只有 左移和右移. 我确实没有注意bitshift这个函数.
谢谢. 回复 7# lanfengc
循环移位 BitRotate 回复 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怎么就有正负号了呢?谢谢 这个问题纠结好久了 我$iBitRotate2和$iBitRotate3结果都是16位
负号是au3的规定最高位表示正负 回复 10# seniors
-2147483645 (32 位) = 1000 0000 0000 0000 0000 0000 0000 0011b (第一位有符号)哪个是第一位啊?最左边的1? 最左边的1指负号
它= 负2^31-3 回复 12# seniors
难道最左边的1既代表符号也能行进运算么?2^31完整的应该是1*2^31啊 还有就是为什么是-3而不是+3啊?
页:
[1]