手机网站建设团队,统一门户网站建设参考规范,永久个人自助建站,wordpress列表分页 js很多人都知道一个有符号的数#xff0c;最高位是1#xff0c;则表示负数#xff0c;最高位是0#xff0c;则表示正数#xff0c;如果假设我的CPU是4位CPU#xff0c;那么对于1001这个数#xff0c;是表示9#xff0c;还是表示-7呢#xff1f;#xff1f;#xff1f;…很多人都知道一个有符号的数最高位是1则表示负数最高位是0则表示正数如果假设我的CPU是4位CPU那么对于1001这个数是表示9还是表示-7呢
其实CPU并不关心这个数是9还是-7因为这个数字是个结果至于它代表正还是负这取决于编程人员自身换句话说这也取决于使用的编译器或者说取决于你使用的高级编程语言
无论0B1001表示正还是负它1之后值都是0B1010它-1之后值都是0B1000所以结果是没问题的CPU就负责算减法还是加法就可以了至于结果你希望它是正还是负
下面是一段Java的代码很明显这段代码的行1是错误的编译的时候就过不去直接报错而行2就是正确的这说明在Java开发语言中int类型是有符号数那么既然是有符号数则必须将32位的int类型中的最高位表示正负而剩下31位用来存放数字所以在JDK处理的时候JDK是知道自己有正负功能的所JDK会判断最高位是0还是1正还是负这与CPU和操作系统没有关系而是JDK来决定这个数是正还是负
public static void main(String[] args) {int a4294967295; // 行142949672952的32次方-1int b2147483647; // 行242949672952的31次方-1
}所以你一定要明白CPU和操作系统是不关心内存或寄存器中的值是正还是负的正负只是程序员强加的概念因为不管正负最终的二进制结果都是相同的CPU只是单纯执行指令获取结果至于如何使用这个结果是程序员自己决定很明显上述使用了JAVA举例你应该明白Java是如何使用这个结果的,当然其他语言也是一样的
add加法指令
mov ax,666
add ax,3 ;cpu执行完本行ax中的值是669sub减法指令
mov ax,666
sub ax,3 ;cpu执行完本行ax中的值是663idiv负数除法指令 在这篇文章中已经使用了div除法指令来编写程序不过div是正数的除法指令很明显与加减法不同乘除法并不能使用相同的指令因为二进制结果不一样我们同样假设现有一个4位的CPU若现在内存中或寄存器的值是1001用这个值除以十进制的2那么CPU应该调用div正数指令执行除法还是使用idiv负数指令执行除法 在上面的Java例子中我们已经非常明确的说过这取决于程序员(或编译器)在这个例子中如果是JAVA等其他高级语言那么会调用idiv指令因为它们都是支持正负的并且约定最高位如果是1则表示负数所以会调用idiv指令
mov ax,0B1001
mov bh,2
idiv bh ;用ax/bx商放到al中余数在ah中与div没什么不同只是结果不一样到这里文章基本结束下面介绍几个拓展有符号数指令假设有如下代码
mov dx,FFFF ;注意是idiv bx被除数高位会在dx低位在ax中因为我用不到dx所以先将所有的位都置1因为是负数
mov ax,0D-7 ;10进制-7
mov bx,2
idiv bx从上面的代码可以看到mov dx,1这行需要我们进行思考然后再写出这行代码而且有一个比mov更快速的指令也就是下面这些 cbw 将AL中有符号的数拓展到AX如果AL中的值是-7则cbw执行完毕AX中的值是FFF9 cwde 将AX中有符号的数拓展到EAX cdqe 将EAX中有符号的数拓展到RAX cwd 将AX中的有符号数扩展到DX:AX如果AX中的值是-7则cwd执行完毕DX中的值是FFFF cdq 将EAX中的有符号数扩展到EDX:EAX cdo 将RAX中的有符号数扩展到RDX:RAX