C语言进制

进制的定义:

进制的定义

那么一进制改怎么表示

由一个符号组成,符号可以任意定义,逢一进一。例如用a表示一进制的符号,那么表示5的话就是aaaaa。

由此类推三进制可以这么定义,由三个符号表示,例如2,8,4表示三进制的符号位,那么表示3的话就是82,表示8的话就是44,计算过程如下:

三进制的计算过程
计算机使用二进制的原因

当然,如果量子计算机真的实现了,我们就会使用量子计算机,那么计算机就不光只能使用二进制计算了,世界科技巨头正在攻克中!

为什么计算机习惯把数据和内存地址以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进制来替代二进制的源文件的用法。

数据类型有长度的原因
常见数据宽度

1位只能存储一个0或者1   1字节能存储8位8个0或者1或者0.1    1字能存储16位16个0或者1或者0.1    1个双字能存储32位32个0或者1或者0.1  所以他们的存储范围分别是:

数据宽度不同,可存储的范围不一样

0x表示16进制,上面我们已经知道一个16进制的数代表4位二进制,即0xFF也可以表示成1111 1111八个1,正好是八位二进制,1字节的宽度,所以能表示的最大范围就是0~0xFF

如果数据宽度超过了最大宽度,超出的高位数据会被丢弃,如下面过程:所使用的编译器是VC++6.0    XCODE编译器不支持这样的语法以及使用地址查询这种工具

char类型在内存或者寄存器中占8个位,即一个字节,表示的最大值是0xFF
变量x的地址
变量x起始地址存放的16进制值是FF,可以看出超出的高位计算机丢弃了
无符号数二进制转换成十六进制是多少就是多少 0x9A 154

无符号数全是正数,有符号数可正可负,对于有符号数,如果最高位是0则为正数,最高位是1则为负数

有符号数,最高位是0 正数
有符号数,最高位是1 负数

验证有符号和无符号数在内存或者寄存器中是如何存储的:如下面过程,

打印输出0x1A000000的无符号数和有符号数的结果
打印结果是一样的

可以看出有符号和无符号结果是一样的,前提是对于正数的有符号和无符号是这个结果,0x1A000000二进制表示是0001 1010 0000 0000 0000 0000 0000 0000可以看出最高位是0,则不管是有符号还是无符号,结果都是正数,如果把最高位改为1,结果会怎样呢,同样如下验证:

打印输出0x9A000000的无符号数和有符号数的结果
打印结果不一样

可以看出有符号和无符号结果是不一样的,无符号打印是它自身的值,有符号数打印是负数,0x9A000000二进制表示是1001 1010 0000 0000 0000 0000 0000 0000可以看出最高位是1,则有符号数打印结果是负数

对于0x9A000000打印有符号的结果为啥是-1711276032这个结果,就需要认识一下二进制的原码 反码和补码是怎么一回事!

原码 反码 补码的定义:

正数负数原码 反码 补码的定义

例如1的原码是多少,首先要确定1的数据宽度,即占多大空间,假如数据宽度是8位,那么1的原码就是0000 0001,又因为正数的原码和反码 补码相同则反码 不嘛都是0000 0001

又比如6的原码是0000 0110,则6的反码 补码都是0000 0110

下面看一下计算机是一什么样的形式存储正数的,如下过程:

正数1在计算机中是怎么存储的
变量x的地址是0012FF7C
0012FF7C地址里面放的是十六进制01即十进制1

可以看出正数在计算机中是以原码存储的,也可以是以反码 补码存储的,因为正数的原码 反码 补码是一样的

又例如-1的原码是1000 0001,最高位是符号位(1表示负数),后面几位的值是-1的绝对值,所以-1的原码是1000 0001  -1的反码是1111 1110   -1的补码是1111 1111如果用十六进制表示就是0xFF 验证过程如下:

负数-1在计算机中是怎么存储的
变量的地址
0012FF7C地址里面放的是十六进制FF即负数-1

可以看出负数在计算机中是以补码存储的

可以再一次验证一下-7在计算机中存储结果是啥?-7的原码是1000 0111    -7的反码是1111 1000    -7的补码是1111 1001 把上面程序改一下,过程如下:

把-1改成-7看下存储结果
变量x地址
0012FF7C存储的值是F9二进制形式是1111 1001

所以可以确认负数在计算机中是以负数的补码的形式存储的

那么计算机是怎么使用加减乘除进行算数运算的呢,就需要掌握二进制的位运算,加减乘除都是通过位运算实现的,具体实现过程如下:

需要熟练掌握的原因
与运算,都是1才是1
或运算,有一个是1就是1
电路图两个开关都往上打开灯泡是不会亮的,只有一个往上另一个往下灯泡才会亮,即两个开发开的方法不一样,就是异,或就是只要有一条导线再连接上异(开的方向不一样)就构成了一条回路,灯泡就亮了,这就是异或概念的来源
按位取反
左移运算
右移运算

在汇编语言中,如果用shr移动,则高位补0,如果使用sar移动,则高位补1。

7+8=?在计算机的运算过程如下过程

7+8的运算过程

7+6=?在计算机的运算过程如下过程

7+6的运算过程

4-5=(4+(-5))=?在计算机的运算过程如下过程,我们之前验证过-1是0xFF,那么-5就是0xFB了,下面是计算过程

4+(-5)的运算过程

对于乘法运算就是多次相加,比如4*5,就是5个4相加,循环就可以了,对于除法,比如12/3,就是12里面有几个3,可以用12减去3,看什么时候是负数,就得到了商。

github地址

你可能感兴趣的:(C语言进制)