Mr.C 发表于 2011-9-25 13:44:49

对于补码的理解有疑惑,求指点

一个数负数,--->取反 加一   这个可以理解

不过给定的一个数,你怎么知道它是表示正还是表示负

对于F6我第一感觉它是表示246

但它也可以是10通过取反加一 得出的, 就是说,它可以表示 -10

虽然说,它是正是负,是由程序员自己认为的。

那CPU是认为它 -10还是 246

举个例子,在某章节中,callCS:

事实上,CPU认为它是 -10   调试程序,它是往 -10的方向跳转

请帮我理一理这个概念


topcookie 发表于 2011-9-25 13:44:50

楼主有点本末倒置了,首先CPU并不关心他是正还是负,计算的结果是唯一的,最后的结果是正还是负要看程序员怎么处理,比如al,bl两数相加,如果你把他看成无符号数也就是正数相加,那最后的结果你就要考虑CF位,如果CF位为1,也就是有进位,那最后的结果就应该加上2的8次方256,如果看成负数相加就应该考虑OF位,如果OF位为1则最后的结果应该再减去128或者说加上负的128,CPU的计算结果是一样的,只是看程序员

topcookie 发表于 2011-9-25 15:35:00

你那个callCS: 只是相对代码段的偏移,又不是计算哪来的正负

Mr.C 发表于 2011-9-25 19:09:52

topcookie 发表于 2011-9-25 15:35 static/image/common/back.gif
你那个callCS: 只是相对代码段的偏移,又不是计算哪来的正负

我知道是偏移,但,为什么CPU会认为它向上偏移十个单位,而不是向下偏移246个单位呢?
如果我的本意,就是要向下跳转246个偏移,那要CALL多少

topcookie 发表于 2011-9-26 01:29:21

F6相对于FF当然是向上偏移了,往下偏移就得FF+0A,地址由低到高,没有负数的地址,你把概念弄乱了

小晨丶 发表于 2011-9-26 07:53:05

这要看它的最高有效位 最高有效位是用来表示符号的 如果是0表示正数1 表示负数
举个例子 假设机器机长为8位 [+127]补=01111111   [-127]补=10000001
你可以拿个负数到计算器转换下就知道了

tsembrace 发表于 2011-9-26 09:41:29

其实2楼说的已经很清楚了。。
1、为什么要选用补码这一方式,因为无论你需要的是有符号还是无符号的运算,用补码形式的运算的结果都是一致统一的。
比如:01H+91H=92H
如果是有符号数运算,则01H=1;91H=-109;则01H+91H=-108;而92H看作有符号数时也为-108.
如果是无符号数运算,92H=146结果也准确。
当然,如果运算使得相关标志位有变化,还得继续看相应标志位的情况(无符号数看进位标志位;有符号数看溢出标志位)。
2、call cs:
这个应该是跳转目的地址直接在操作指令中的,你不管他是正的F6还是负数-10,他在计算机内总有明确唯一的表示11110110,即执行完后ip=11110110,不需要管他是正还是负。


e马先森 发表于 2017-2-16 13:14:01

这要看它的最高有效位 最高有效位是用来表示符号的 如果是0表示正数1 表示负数
举个例子 假设机器机长为8位 [+127]补=01111111   [-127]补=10000001{:10_261:}
页: [1]
查看完整版本: 对于补码的理解有疑惑,求指点