计算机为什么选用二进制补码(4)--CPU怎么看有符号数和无符号数

来源:互联网 发布:人工智能之父西蒙 编辑:程序博客网 时间:2024/04/30 10:52
1.计算机内存中存放的数值型数据是由编译器处理后保存的;

2.CPU根本不区分有符号数值还是无符号数值,CPU按照相同的运输规律进行计算,并设置相关Flags位,由程序自己决定解释是有符号运算还是无符号运算;

3.如果应用程序逻辑标示的是负数,则编译器送入CPU寄存器的数值都是补码形式标示;

4.引入补码的原因是:
一是:CPU将加,减法统一为加法运算;
二是:补码对加、减、移位等操作具有幂等性。

5.有符号数的加减法,CUP只会设置相应的进位标志寄存器和溢出标志寄存器,
由程序员(汇编程序员)或高级程序语言编译器决定将进位作为符号位,还是数值位;

6.有符号数和无符号数的乘除法,CUP有不同的指令分别处理;

7.CPU可以有硬件阵列乘法器或除法器,

  也可以通过加减,与,或,非,异或等模拟乘除运算。

---------------------------------------------------------------------------

书中写到: 
mov al,10000001B 
add al,1 
可以将add指令进行的运算当作无符号数的运算,也可以将add指令进行的运算当作有符号数的运算。 

问题: 
到底是当作有符号还是无符号数。 

我认为:执行了上面两条指令后,SF标志值肯定是一定的。所以有无符号运算也是定好的。问题就是,我怎么知道进行的是有符号运算还是无符号运算。 

请指点,谢谢。
######################################################
CPU处理一个二进制数时,其实也无法知道这个数是有符号还是无符号数;
由于引入了补码,使得加减计算的指令对有符号数和无符号数的处理是一样的,
所以加减运算时CPU将运算结果作为有符号数和无符号数对符号位的影响都“罗列”出来了,
供编程者根据需要使用;乘除运算有符号数和无符号数所用的指令是不同的。 
那么如何判断一个数究竟是有符号数还是无符号数呢?如果程序(本质上是编程者)
把最高位用作符号位,这就是有符号数;如果把最高位作为有效数位,那就是无符号数了。
    
cpu在执行add等指令时,是必然要影响到SF标志位的值的。至于我们需不需要这种影响,那就看我们如何看待指令所进行
的运算了。 也就是说,到底是有符号数还是无符号数,是有我们来决定的。

这个sf为正还是为负实际上就是计算机运算后给符号位定一个值,是1还是0,我明白了,
在附注的补码中就是说,当最高位为1就代表负数,那么就是当计算后数第一个数为1时,sf也就是1了

#######################################################
在汇编语言里面:
加减其实不分是有符号还是无符号的,主要依靠用户自己判断,
在进行完加减操作以后,对CF, OF两个寄存器进行判断,如有无近位和溢出。
而在乘除计算的时候,则有相应的不同的机器代码对计算数字进行不同的处理。

对于高级语言C,由编译器根据源程序做出判断是有符号还是无符号,再翻译成汇编程序处理;

##################################
对于乘除法:CPU有不同的指令
读与加减:CPU按照统一格式进行处理,
原因是有无符号运算结构一致(原因是计算机采用补码进行运算决定的)










原创粉丝点击