美文网首页
C语言进制

C语言进制

作者: 八匹马_BPM | 来源:发表于2019-01-04 13:48 被阅读0次

    进制的定义:

    进制的定义

    那么一进制改怎么表示

    由一个符号组成,符号可以任意定义,逢一进一。例如用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语言进制

          本文链接:https://www.haomeiwen.com/subject/kqhhrqtx.html