进制的定义:
![](https://img.haomeiwen.com/i9687540/1c5b87c7e1b65297.png)
那么一进制改怎么表示
由一个符号组成,符号可以任意定义,逢一进一。例如用a表示一进制的符号,那么表示5的话就是aaaaa。
由此类推三进制可以这么定义,由三个符号表示,例如2,8,4表示三进制的符号位,那么表示3的话就是82,表示8的话就是44,计算过程如下:
![](https://img.haomeiwen.com/i9687540/3e0256c010d48856.png)
![](https://img.haomeiwen.com/i9687540/7f856eef0f527385.png)
当然,如果量子计算机真的实现了,我们就会使用量子计算机,那么计算机就不光只能使用二进制计算了,世界科技巨头正在攻克中!
为什么计算机习惯把数据和内存地址以16进制的形式表示,原因如下,二进制0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 如果我们用0表示0000 1表示0001 2表示0010依次类推 9表示1001 A表示1010 B表示1011 C表示1100 D表示1101 E表示1110 F表示1111。 到此我们发现这些符号正好是表示16进制的符号,所以,我们可以用一个16进制的符号表示4位的二进制数据,如果对密码学有研究的同学,对这个应该是很敏感,并且能够一眼看出两者的关系的。
可以任意一个可执行文件(.exe或者.dmg)查看他的二进制源文件就是一大推的AE 02 87 F3 B1 6A等等,可以看到任何一个可执行文件的源文件都是用16进制表示的,当然可可以用二进制表示,那么AE就写成了10101110如果一大串的话,看着是很麻烦的,所以计算机就有了用16进制来替代二进制的源文件的用法。
![](https://img.haomeiwen.com/i9687540/3ff35b5daaa4fef8.png)
![](https://img.haomeiwen.com/i9687540/9d4ee2ae12ffab04.png)
1位只能存储一个0或者1 1字节能存储8位8个0或者1或者0.1 1字能存储16位16个0或者1或者0.1 1个双字能存储32位32个0或者1或者0.1 所以他们的存储范围分别是:
![](https://img.haomeiwen.com/i9687540/bea8f38ca450ba1e.png)
0x表示16进制,上面我们已经知道一个16进制的数代表4位二进制,即0xFF也可以表示成1111 1111八个1,正好是八位二进制,1字节的宽度,所以能表示的最大范围就是0~0xFF
如果数据宽度超过了最大宽度,超出的高位数据会被丢弃,如下面过程:所使用的编译器是VC++6.0 XCODE编译器不支持这样的语法以及使用地址查询这种工具
![](https://img.haomeiwen.com/i9687540/07050208b48e4e06.png)
![](https://img.haomeiwen.com/i9687540/f4140db55df7f992.png)
![](https://img.haomeiwen.com/i9687540/88900c717780741d.png)
![](https://img.haomeiwen.com/i9687540/cbb123ad48afb8fa.png)
无符号数全是正数,有符号数可正可负,对于有符号数,如果最高位是0则为正数,最高位是1则为负数
![](https://img.haomeiwen.com/i9687540/958808a950cc811d.png)
![](https://img.haomeiwen.com/i9687540/6fba553d154685c8.png)
验证有符号和无符号数在内存或者寄存器中是如何存储的:如下面过程,
![](https://img.haomeiwen.com/i9687540/fc5886b462f81862.png)
![](https://img.haomeiwen.com/i9687540/bc187fd88b2f4635.png)
可以看出有符号和无符号结果是一样的,前提是对于正数的有符号和无符号是这个结果,0x1A000000二进制表示是0001 1010 0000 0000 0000 0000 0000 0000可以看出最高位是0,则不管是有符号还是无符号,结果都是正数,如果把最高位改为1,结果会怎样呢,同样如下验证:
![](https://img.haomeiwen.com/i9687540/0e9a7173a15fe894.png)
![](https://img.haomeiwen.com/i9687540/8035b872d4d9ff45.png)
可以看出有符号和无符号结果是不一样的,无符号打印是它自身的值,有符号数打印是负数,0x9A000000二进制表示是1001 1010 0000 0000 0000 0000 0000 0000可以看出最高位是1,则有符号数打印结果是负数
对于0x9A000000打印有符号的结果为啥是-1711276032这个结果,就需要认识一下二进制的原码 反码和补码是怎么一回事!
原码 反码 补码的定义:
![](https://img.haomeiwen.com/i9687540/7c907b10bb70dcae.png)
例如1的原码是多少,首先要确定1的数据宽度,即占多大空间,假如数据宽度是8位,那么1的原码就是0000 0001,又因为正数的原码和反码 补码相同则反码 不嘛都是0000 0001
又比如6的原码是0000 0110,则6的反码 补码都是0000 0110
下面看一下计算机是一什么样的形式存储正数的,如下过程:
![](https://img.haomeiwen.com/i9687540/174332f611436e05.png)
![](https://img.haomeiwen.com/i9687540/0eac7259cbe9ba52.png)
![](https://img.haomeiwen.com/i9687540/f69429fb4b985708.png)
可以看出正数在计算机中是以原码存储的,也可以是以反码 补码存储的,因为正数的原码 反码 补码是一样的
又例如-1的原码是1000 0001,最高位是符号位(1表示负数),后面几位的值是-1的绝对值,所以-1的原码是1000 0001 -1的反码是1111 1110 -1的补码是1111 1111如果用十六进制表示就是0xFF 验证过程如下:
![](https://img.haomeiwen.com/i9687540/29e5a105e3ae5c24.png)
![](https://img.haomeiwen.com/i9687540/05c8064af4cd76b4.png)
![](https://img.haomeiwen.com/i9687540/c85ec3a82428d950.png)
可以看出负数在计算机中是以补码存储的
可以再一次验证一下-7在计算机中存储结果是啥?-7的原码是1000 0111 -7的反码是1111 1000 -7的补码是1111 1001 把上面程序改一下,过程如下:
![](https://img.haomeiwen.com/i9687540/a5efe39f2fc6a0ae.png)
![](https://img.haomeiwen.com/i9687540/ae3f447f139c6a19.png)
![](https://img.haomeiwen.com/i9687540/372a5c3850317ce6.png)
所以可以确认负数在计算机中是以负数的补码的形式存储的
那么计算机是怎么使用加减乘除进行算数运算的呢,就需要掌握二进制的位运算,加减乘除都是通过位运算实现的,具体实现过程如下:
![](https://img.haomeiwen.com/i9687540/2432806ce7e0c1cc.png)
![](https://img.haomeiwen.com/i9687540/ae660ca3cf2e9e0d.png)
![](https://img.haomeiwen.com/i9687540/49f5defb83e1134f.png)
![](https://img.haomeiwen.com/i9687540/71607b99b1ac330c.png)
![](https://img.haomeiwen.com/i9687540/39509ab6425a9334.png)
![](https://img.haomeiwen.com/i9687540/61d69cd85db692bf.png)
![](https://img.haomeiwen.com/i9687540/58f217d915bf6bed.png)
在汇编语言中,如果用shr移动,则高位补0,如果使用sar移动,则高位补1。
7+8=?在计算机的运算过程如下过程
![](https://img.haomeiwen.com/i9687540/0a5c76b21d7246b9.png)
7+6=?在计算机的运算过程如下过程
![](https://img.haomeiwen.com/i9687540/beb4187de22eebef.png)
4-5=(4+(-5))=?在计算机的运算过程如下过程,我们之前验证过-1是0xFF,那么-5就是0xFB了,下面是计算过程
![](https://img.haomeiwen.com/i9687540/ae6bfef0069b6bec.png)
对于乘法运算就是多次相加,比如4*5,就是5个4相加,循环就可以了,对于除法,比如12/3,就是12里面有几个3,可以用12减去3,看什么时候是负数,就得到了商。
网友评论