欢迎光临散文网 会员登陆 & 注册

计算机本质-数据运算

2020-06-19 11:56 作者:无情剑客Burning  | 我要投稿

最初在自学《计算机体系结构》的时候,始终没能理解原码、反码、补码到底是做什么的?直到有一天,我看到一条汇编指令"e8 db ff ff ff"。这是跳转指令,其中"db ff ff ff"是跳转的偏移,由于采用小端法,跳转偏移应该是0xffffffdb,还是不能理解呀。难道这就是体系结构中所讲述的补码?是的,就是补码,这串数字代表-0x25也就是-37。那究竟什么是补码?计算机为何使用补码来存储数据?理解这些,就能理解在什么情况下-128*-1=-128了。后续会介绍基于整数越界获取root权限,而-128*-1正是一个经典的整数越界问题。

原码是什么?

原码就是早期用来表示数字的一种方式: 一个正数,转换为二进制位就是这个正数的原码。负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码

举例说明:

      int类型的 3 的原码是 11B(B表示二进制位), 在32位机器上占四个字节,那么高位补零就得:

      00000000 00000000 00000000 00000011

      int类型的 -3 的绝对值的二进制位就是上面的 11B 展开后高位补1就得:

      10000000 00000000 00000000 00000011

但是原码有几个缺点,零分两种 +0 和 -0 。很奇怪是吧!还有,在进行不同符号的加法运算或者同符号的减法运算的时候,不能直接判断出结果的正负。你需要将两个值的绝对值进行比较,然后进行加减操作 ,最后符号位由绝对值大的决定。于是反码就产生了。

反码是什么?

正数的反码就是原码,负数的反码等于原码除符号位以外所有的位取反

      举例说明:

      int类型的 3 的反码是

      00000000 00000000 00000000 00000011

      和原码一样没什么可说的

      int类型的 -3 的反码是

      11111111 11111111 11111111 11111100

      除开符号位 所有位 取反

解决了加减运算的问题,但还是有正负零之分,然后就到补码了

补码是什么?

正数的补码与原码相同,负数的补码为 其原码除符号位外所有位取反(得到反码了),然后最低位加1.

      还是举例说明:

      int类型的 3 的补码是:

      00000000 00000000 00000000 00000011

      int类型的 -3 的补码是

      11111111 11111111 1111111 11111101

      就是其反码加1

公众号

微信公众号:无情剑客


计算机本质-数据运算的评论 (共 条)

分享到微博请遵守国家法律