xiaohaituan 发表于 2017-12-4 10:21:57

关于标志寄存器

为何对于8位的有符运算范围是-128--127为何不是-256--255,是因为最高位用来代表符号不用来计数的原因吗?假如两个数值进行有浮运算,为何都用补码表示,是因为超过了这个范围?

兰陵月 发表于 2017-12-4 11:56:47

要理解补码以及它的一切相关,建议先了解补码的前世今生,请看:


我们的前辈考虑了很多计算机进行负数计算的问题,首先他们是这么的考虑的:


上面这种方法行不通以后,他们又考虑了下面的方法:


结果,他们又发生同样是行不通的,最后,他们终于考虑了补码这个玩意:




这就是补码的前世今生。


假如两个数值进行有浮运算,为何都用补码表示,是因为超过了这个范围?
不是,两个有符号数用补码进行计算,是因为补码计算后的结果是自然数学上的正确结果(用补码规则)。

xiaohaituan 发表于 2017-12-4 13:35:25

兰陵月 发表于 2017-12-4 11:56
要理解补码以及它的一切相关,建议先了解补码的前世今生,请看:




如果10h与90h进行有符加运算如何算,

3-3 发表于 2017-12-4 16:14:10

xiaohaituan 发表于 2017-12-4 13:35
如果10h与90h进行有符加运算如何算,

先把10h与90h分别化为16位数据,分别是 0001 0000, 1001 0000,其中0001 0000表示正16,1001 0000表示负112,然后两者相加,结果为-96,用二进制表示为1010 0000

xiaohaituan 发表于 2017-12-4 17:58:13

3-3 发表于 2017-12-4 16:14
先把10h与90h分别化为16位数据,分别是 0001 0000, 1001 0000,其中0001 0000表示正16,1001 0000表示负1 ...

为何90h看做是负数,90h是负112的补码,同样10h也可以看成是负240的补码,

3-3 发表于 2017-12-4 18:50:57

xiaohaituan 发表于 2017-12-4 17:58
为何90h看做是负数,90h是负112的补码,同样10h也可以看成是负240的补码,

你把10h变为16位的二进制看一下,最高位不是1.

兰陵月 发表于 2017-12-4 20:06:30

本帖最后由 兰陵月 于 2017-12-4 20:17 编辑

xiaohaituan 发表于 2017-12-4 13:35
如果10h与90h进行有符加运算如何算,
如果10h与90h进行有符加运算如何算,


既然进行的是有符号数的运算,表明这两个数都是有符号数。另外楼主你还要告诉这是进行的几位有符号数的运算,是8位?还是16位?还是32位?

兰陵月 发表于 2017-12-4 20:15:54

3-3 发表于 2017-12-4 16:14
先把10h与90h分别化为16位数据,分别是 0001 0000, 1001 0000,其中0001 0000表示正16,1001 0000表示负1 ...

对的

兰陵月 发表于 2017-12-4 20:32:38

xiaohaituan 发表于 2017-12-4 17:58
为何90h看做是负数,90h是负112的补码,同样10h也可以看成是负240的补码,

你这种思考问题的方式还是我们人类的方式,你要从计算机的角度去思考。

第一:要确定进行操作的源操作数和目的操作数的字长。
本题目中,(编写程序的过程中),计算机会要你确定,你要进行相加操作的数的位数是多少?
比如10h和90h相加。
计算机要求两个数字都是相同长度的,如果长度不同,就不能编译,你也无法运行。
在你没有指定的时候,它是默认的,比如8086是默认16位。
比如mov ax,10h;它默认10H是16位的,因为寄存器ax是16位的;
像下面的语句:
mov ax,10h
mov bx,90h
add bx,ax
最终结果在bx为:0000 0000 1010 0000,它的结果是十六进制数00A0H,也即160D,十进制正数160。


又比如mov al,10h;它默认10h是8位的,因为寄存器al是8位的。
对于下面的语句:
mov al,10h
mov bl,90h
add bl,al
最终的结果在bl中:1010 0000,它的结果是十六进制数A0H,也即十进制负数-96。


第二:在确定了源操作数和目的操作数长度后,你思考的时候就要用相同的长度去思考
你的疑问:为何90h看做是负数,90h是负112的补码,同样10h也可以看成是负240的补码,
当90H为8位有符号数的时候,它就是-112;
当90H为8位无符号数的时候,它就是160;
当90H为16位有符号数的时候,它也是+160,实际上它在机器里应该是0090,只不过我们书写的时候把前面00去掉了。


同理
当10h为8位有符号数的时候,它就是+16;.
当10h为8位无符号数的时候,它就是16;
当10h为16位有符号数的时候,它也是+16,实际上它在机器里应该是0010,我们书写或者编程的时候同样去掉前面的0


兰陵月 发表于 2017-12-4 20:39:54

xiaohaituan 发表于 2017-12-4 17:58
为何90h看做是负数,90h是负112的补码,同样10h也可以看成是负240的补码,
记住下面这些,很重要,否则你的脑袋会不断纠结,最后打死结。
计算机并不知道这个数是有符号数还是无符号数。它只认识0和1。
我所说的前辈们搞的补码这个玩意,是给我们这些程序员进行理解用的。
换句话说:
你说它是补码,那它就是补码;你说它是原码,那它就是原码。
你说它是有符号数,那它就是有符号数;你说它是无符号数,那它就是无符号数。
最后,请校正你的脑袋。那就是:
当我想它是补码的时候,跟它有关联的数据和运算,在脑袋里默默运算时,都要在补码的基础上进行思考。
当我想它是有符号数的时候,跟它有关联的数据和运算,在脑袋里默默运算时,都要在有符号数的基础上进行思考。
以下同理推断。

兰陵月 发表于 2017-12-4 20:42:09

本帖最后由 兰陵月 于 2017-12-4 20:50 编辑

希望你能迅速理解,反正我当初没有迅速理解得了,最后只好不去理解,因为反正结果正确。最后在无休止的苦逼学习中,慢慢悟出来了。{:10_247:}

兰陵月 发表于 2017-12-4 20:48:46

本帖最后由 兰陵月 于 2017-12-4 20:52 编辑

xiaohaituan 发表于 2017-12-4 17:58
为何90h看做是负数,90h是负112的补码,同样10h也可以看成是负240的补码,
-240这个数,你是永远无法用最高为1的8位二进制来表示的,不信打个赌~{:10_256:}
当然,它是可以用最高位为1的16位二进制数来表示的。{:10_254:}既然它是16位的,那前面的90H也要看成是16位的。
16位的90H的二进制为:0000 0000 1001 0000
这样看,它的最高为变成了0,很明显,此时它已经是一个正数了。
所以要在数据长度一样的基础上来理解,就是这个道理。

xiaohaituan 发表于 2017-12-4 22:44:48

谢谢老哥,辛苦了,说的这么仔细

兰陵月 发表于 2017-12-5 11:58:25

xiaohaituan 发表于 2017-12-4 22:44
谢谢老哥,辛苦了,说的这么仔细

{:10_332:}{:10_332:}
页: [1]
查看完整版本: 关于标志寄存器