公司网站建设付款分录,天津网站优化多少钱,平面设计免费软件,重庆网站建设方案详细方案文章目录《计算机系统基础》——运算整数按位运算作用操作位移运算作用操作乘法运算除法运算浮点数加减运算乘除运算《计算机系统基础》——运算
#x1f680;#x1f680;本章我们需要介绍的是有关C语言里面的运算#xff0c;当然了#xff0c;我们不会是介绍简单的运算本章我们需要介绍的是有关C语言里面的运算当然了我们不会是介绍简单的运算而是详细地介绍一下我们在日常开发中进行运算时可能遇到的问题。好了就让我们开始今天的学习吧
整数
按位运算
作用
按位运算在我们日常的开发中出现的比较少他的作用主要就是对位串实现“掩码”mask操作或相应的其他处理比如在嵌入式领域一般用来控制寄存器的值以达到相应的功能。
操作
按位或“|”按位与“”按位取反“~”按位异或“^”
比如用下面的语句用“”实现“掩码”操作作用为从数据y中提取低位字节并使高字节为0。
y 0x00FF位移运算
一提到移位操作很多人就是觉得只是用来乘除2的但是事情并没有那么简单接下来我们来详细的介绍一下。
作用
位移运算在我们的日常开发中一般都是用来乘除2的但是它不仅仅只有这一个功能除此之外它还可以提取部分信息。
操作
左移 xk乘2右移 xk除2 逻辑右移在左边补k个0算数右移在左边补k个最高位的有效数字
我们在下方给出关于逻辑右移和算数右移的例子来帮助大家理解。
操作值1值2参数x[01100011][10010101]x 4[00110000][01010000]x 4逻辑右移[00000110][00001001]x 4算数运算[00000110][11111001]如果位移数大于数据位数怎么办呢答案很简单会对数据取余比如对32位数据右移36位其实就是右移4位。 乘法运算
在高级语言中两个n位整数相乘得到的结果通常也是 一个n位整数也即结果只取2n位乘积中的低n位。 比如0101 * 0101 00011001我们只取后4位得到1001经过换算结果应该是-111也就是-7显然与我们想要得到的数字明显不一样。 那我们有没有什么办法去判断我们的结果是否是正确的呢或者说到底什么情况下结果不会溢出答案是肯定的我们接下来就来介绍一下。
判断我们最后的结果是正确的我们可以使用下面的语句去判断
当 !x || z/xy 为真时然后当我们的结果在-2n-1 ≤ x*y 2n-1 时结果是不会溢出的其实也就是乘积的高n1位为全0或全1这样的结果就是正确的。 整数乘法运算比移位和加法等运算所用时间长因此编译器在处理变量与常数相乘时往往以移位、加法和减法的组合运算来代替乘法运算所以我们可以使用位移来代替乘法指令比如x * 20因为20 16 20 24 22 所以我们可以转换为(x4)(x2)。
除法运算
除法运算和乘法运算其实是类似的但是只有带符号整数进行**-2n-1/-1 2n-1**操作会发生溢出之外其他都不会溢出因为2n-1无法用n位来表示。
#includestdio.hvoid main ()
{int u 0x80000000; printf (u %x %x %d\n, u , u / -1, u / -1);
}运行结果如下所示u 80000000 80000000 -2147483648我们可以看到在16进制下u和u / -1 的结果是一样的。
除法运算的商为整数于是如何进行取整就很重要了我们只需要记住一个原则就是按照朝0的方向舍入。即正数商取比自身小的最接近整数负数商取比自身大的最接近整数。
同样的为了缩短除法运算的时间我们可以采用右移运算来实现。如果能整除我们就直接右移如果不能整除我们就可以加一个偏移量(2k -1)再右移即可接下来我们就来介绍一下。
14/4 3 0000 1110 2 0000 0011
-14/4 1111 0010 0000 0011 1111 0101 2 1111 1101 -3浮点数
对于浮点数我们就不做过多的介绍简单介绍一下运算以及其异常但是浮点运算涉及的精度以及异常是非常重要的有机会以后可以单独介绍一下
加减运算
对于浮点数的加减运算我们只需要注意他是先对齐阶码再进行运算如下所示 A ± B (Ma Mb* 2-(Ea-Eb)) * 2Ea (假设EaEb ) 需要注意的就是当我们的尾数高位为0则需左规尾数左移一次阶码减1直到MSB为1。当尾数最高位有进位需右规尾数右移一次阶码加1直到MSB为1。
乘除运算
乘除运算就需要注意阶码上溢一个正指数超过了最大允许值和下溢一个负指数超过了最小允许值的问题。过多的就不再介绍了感兴趣的同学可以自行去查找资料。