有符号的整数-负数在内存的存放形式

有符号整数,正数的表示区间为:0x00000000-0x7FFFFFFF;负数的表示区间:0x80000000-0xFFFFFFFF。

负数在内存中都是以补码的形式存放,补码的规则是用0减去这个数的绝对值。也可以表示为对这个数取反加1;

为什么补码是对这个数取反加1呢?因为,X+X(反)=0xFFFFFFFF,于是X+X(反)+1=0,所以可以推导出0-X=X(反)+1;

计算机只会做加法,计算机把减法都转化为加法:

例如:3-2会转化为3+(-2);-2的补码为0xFFFFFFFE。0x00000011+0xFFFFFFFE=0x100000001; 存储的范围为4字节大小。

超出的1将被舍弃,结果为0x00000001。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一段实现该功能的汇编代码: ``` MOV CX, 12 ; 用CX寄存器存储元素的数量 MOV SI, 0 ; 用SI寄存器存储当前元素的偏移量 MOV DI, PLUS ; 用DI寄存器存储PLUS变量的地址 MOV BX, 0 ; 用BX寄存器存储正数的数量 MOV DX, 0 ; 用DX寄存器存储负数的数量 MOV AX, 0 ; 用AX寄存器存储当前元素的值 MOV WORD PTR [DI], 0 ; 将PLUS变量初始化为0 ADD DI, 2 ; 将DI寄存器移动到NEG变量的地址 MOV WORD PTR [DI], 0 ; 将NEG变量初始化为0 ADD DI, 2 ; 将DI寄存器移动到ZERO变量的地址 MOV WORD PTR [DI], 0 ; 将ZERO变量初始化为0 ADD DI, -6 ; 将DI寄存器移回PLUS变量的地址 LOOP_START: MOV AX, WORD PTR [TABLE+SI] ; 将当前元素的值读取到AX寄存器中 CMP AX, 0 ; 比较AX寄存器中的值和0 JG IS_POSITIVE ; 如果大于0,则跳转到IS_POSITIVE JL IS_NEGATIVE ; 如果小于0,则跳转到IS_NEGATIVE INC WORD PTR [DI] ; 否则将ZERO变量的值加1 JMP CONTINUE ; 跳转到CONTINUE IS_POSITIVE: INC BX ; 将正数的数量加1 JMP CONTINUE ; 跳转到CONTINUE IS_NEGATIVE: INC DX ; 将负数的数量加1 CONTINUE: ADD SI, 2 ; 将SI寄存器移动到下一个元素的偏移量 LOOP LOOP_START ; 继续循环直到所有元素都被处理 MOV WORD PTR [PLUS], BX ; 将正数的数量存储在PLUS变量中 MOV WORD PTR [NEG], DX ; 将负数的数量存储在NEG变量中 ``` 该程序使用CX寄存器存储元素的数量,使用SI寄存器存储当前元素的偏移量,使用DI寄存器存储变量的地址。程序将PLUS、NEG、ZERO变量的地址分别存储在DI寄存器中,并初始化它们的值为0。然后,程序使用循环处理每个元素。对于每个元素,程序将其读取到AX寄存器中,并将其与0进行比较。如果它大于0,则将BX寄存器中的正数数量加1。如果它小于0,则将DX寄存器中的负数数量加1。如果它等于0,则将DI寄存器中的ZERO变量的值加1。最后,程序将PLUS、NEG、ZERO变量的值存储在相应的内存单元中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值