猫咪没有鱼 发表于 2021-1-8 22:51

求解,关于负数补码、原码之间的转换问题

00EE3E50 55                   push      ebp
00EE3E51 8B EC                mov         ebp,esp
00EE3E53 81 EC D0 00 00 00    sub         esp,0D0h
00EE3E59 53                   push      ebx
00EE3E5A 56                   push      esi
00EE3E5B 57                   push      edi
00EE3E5C 8D BD 30 FF FF FF    lea         edi,
00EE3E62 B9 34 00 00 00       mov         ecx,34h
00EE3E67 B8 CC CC CC CC       mov         eax,0CCCCCCCCh
00EE3E6C F3 AB                rep stos    dword ptr es:



各位大神,是这样的,我main函数通过 sub         esp,0D0h 指令开辟了0D0h (208)个字节,然后当我看到lea         edi,指令中
的 FFFFFF30h 这样的负数时,想自己动手转换为0D0h。
但是我用 原码 = 补码取反 +1 算,得到的结果和 编译器算的不一样啊,明显我错了,但是我不清楚错在哪里,求助们救救孩子吧!!{:5_122:}

RGO_小柒 发表于 2021-1-8 22:51

在计算机中,负数是以补码形式存储
补码转原码,原码转补码,都可以这样转:
[符号位不变,其他位取反,末尾加1]
ffffff30二进制表示:
1111 1111 1111 1111 1111 1111 0011 0000
符号位不变其位取反:
1000 0000 0000 0000 0000 0000 1100 1111
末位加一得:
1000 0000 0000 0000 0000 0000 1101 0000                               
这是原码,最高位为符号位,1代表负数,所以这个数字的真值为
-D0H

猫咪没有鱼 发表于 2021-1-14 22:04

负数在计算机中使用补码的形式存储的,正数的原码、反码、补码都是一样的这是规定。
F         F         F         F      F      F       3       0   
二进制表示形式
11111111    1111      1111111111110011   0000       补码除符号位,其余取反
1000   0000    0000   0000   00000000 1100   1111      加一
1000   0000    0000   0000   00000000 1101   0000   
1101   0000   对应的十六进制就是   D0(十进制就是208),注意符号位,所以就是 -208
页: [1]
查看完整版本: 求解,关于负数补码、原码之间的转换问题