欢迎使用CSDN-markdown编辑器

来源:互联网 发布:新南威尔士大学知乎 编辑:程序博客网 时间:2024/06/09 18:38

C语言学习笔记1:进制
自然语言一般使用十进制表示大小以及进行相关运算,而机器语言则使用二进制,由于这两种表达方式的不同,导致了我们在理解计算机编程和硬件结构时,需要掌握他们各自的计算和相互间的转换方式,下面是关于这一部分内容的我的一些笔记。
1.二进制:每一位只有两种状态,0和1,因为在大部分机器的一个端口或接口在输入与输出时只显示两种状态,高电平和低电平,这种特性也影响到了它的编程语言,因此,在编程语言中,使用1表示高电平,0表示低电平。
二进制在C语言中没有明确的表示方法,一般在理解时用右下标2(或用数据尾部加B)表示这是个二进制数,
二进制加法,逢二进一,
如:1010 + 0111 = 10001
二进制减法,逢二当一,
如:1010 - 0111 =0011
注:可以借用小学计算多位十进制加减法的运算规律,在本式中,被减数1010可以看为1000 + 10,在转换为100 + 100(或为10 + 10) + 10 ,减数0111则视为0100 + 10 + 1,这样再相减,易得结果为0011。
二进制乘法,移位累加

2.八进制、十六进制,可视为三位二进制和四位二进制的转换,
在C语言中,分别用以前缀数字0,0x或0X(x的大小写关系到十六进制的后六个数的大小写表示)来分别表示。
加减法与参考十进制加减运算法则,或者转换为二进制来运算。

3.进制间的转换,十进制转换为R进制整数,同除以R,余数为这一位上的数值,转换为R进制小数,同乘以R,进位为这一位数值。
R进制转换为十进制,每一位上的数值乘以权重,再累加,累加和即为它的十进制表示方式。
注:整数转换时两种进制是一一对应关系,每一个二进制都有对应的十进制表示,反之亦然。但小数转换却并不总是如此,例如 0.6无法找到一个准确有限的二进制表示。为什么这样呢?个人认为,根本原因是整数小数的表示方式不同,整数,是各位的权重乘以该位数值累加而得,且二、十乃至八、十六这几种进制的基本累加数都是单位1,同时他们皆从零以一为基本单位逐个累加,尽管他们的进位法则不同,但这并不影响他们间的对应关系。而小数的表示却不完全相同,小数类似于是用分割累加,这样导致小数没有唯一的类似单位一的基本数(这是我自己杜撰出的一个词LOL)。在整数中,整数10可以用10个“1”来表示,而十进制数的小数0.6则是把单位1分为十份,取其中的6份来表示0.6,同理在二进制中,若表示0.1,则将单位1分割为两份,取其中1B份表示,若表示0.11B呢,很明显,将分得的0.1B再次一分为二,取其中一份也就是0.01B与原本的0.1B=0.5相加即得0.11B=0.75,那么问题来了,无论是几进制,都只能表示用它自身分割后得到的数来为基准乘以该位数值再相加来表示一个数,十进制只能用0.1n1+0.01n2+0.001n3+0.0001n4……(0<=ni<10)来表示,二级制也只能用0.5m1+0.25m2+0.125m3……(0<=mi<2)表示,在这里,我们令前式为F,后式为G,当我们求解进制转换时,就相当于求解F = G,这个方程的解,很明显,当左式为0.6时,右边不能找到有限个合适的mi的值来使等式成立,但是,可以用近似的方法表示,虽然会产生误差。
4.数据如何在计算机硬件中存储,数据存储通常以字节为单位整体存储,在8086中,寻址找到与符号相对应的物理地址,再将数据存储进去,如果要更改某一位的值,则应先寻址,取出其中存放的数据置于cpu的寄存器中,在进行逻辑或数学运算,在存储到对应的物理地址中去。
注:在某些书中看到有虚拟地址这一说法,是存在于cpu与物理地址主要起连接作用,但具体是什么,现在掌握的还不够多,以后再补充。