文章目录
前言
本小节定点数的逻辑、移位、加减运算
一、C语言的运算到底有哪些?
1.1 概述
- 涉及到的定点数运算
- 算术运算
- 带符号整数运算:取负 / 符号扩展 / 加 / 减 / 乘 / 除 / 算术移位
- 无符号整数运算:0扩展 / 加 / 减 / 乘 / 除
- 逻辑运算
-
逻辑操作:与 / 或 / 非 / …(比较简单,看下图就能理解)
-
移位操作:逻辑左移 / 逻辑右移
-
- 涉及到的浮点数运算:加、减、乘、除
1.2 移位操作(无符号、有符号)ps:浮点数没有
左移::x<<k; 右移: x>>k
-
不区分是逻辑移位还是算术移位,由x的类型确定
-
无符号数:逻辑左移、逻辑右移
- 高(低)位移出,低(高)位补0,可能溢出!问题:何时可能发生溢出?如何判断溢出?
若高位移出的是1,则左移时发生溢出
- 高(低)位移出,低(高)位补0,可能溢出!问题:何时可能发生溢出?如何判断溢出?
-
带符号整数:算术左移、算术右移
- 左移:高位移出,低位补0。可能溢出!
溢出判断:若移出的位不等于新的符号位,则溢出。 - 右移:低位移出,高位补符,可能发生数据丢失。
1.3扩展与截断
总结: 无符号数扩展补0;带符号数扩展补符号;小数扩展后面补0; 无符号、带符号截断阶段前面的数据;小数阶段后面的数据。
这个有可能发生,类型转换。在C语言中int可以与float互转,先把int写成32个16进制,然后进行规格化。如果有效位超过了23个(截断后面的),那么会丢失精度。 - 左移:高位移出,低位补0。可能溢出!
1.4 整数加减法
1.4.1全加器
计算机中无论是无符号整数还是带符号整数,都是采用ALU的方式进行加法运算。无符号整数是否溢出看CF(加法就看前面那一位,减法就将前面那一位取反)、带符号整数是否溢出看OF。
重要认识1:计算机中所有运算都基于加法器实现!
重要认识2:带符号数还是无符号数。加法器不知道所运算的是
重要认识3:加法器不判定对错,总是取低n位作为结果,并生成标志信息。
1.4.2 原码的加减运算
原码的加减运算也需要算,因为浮点数需要。看下面两个图片
1.4.3 移码的加减运算