计算机中数的本质——Linux C编程一站式学习

为什么计算机用二进制

计算机是用数字电路搭成的,数字电路中只有1和0两种状态,只能逢二进一,所以是二进制。即计算机中1+1=10;

不同进制之间的换算

对于二进制换算为十进制:(A3A2A1A0)2=A3×23+A2×22+A1×21+A0×20对于(A3A2A1A0)2这样一个二进制数,最左边的A3位称为最高位(MSB),最右边的A0位称为最低位(LSB)。通常把LSB称为第0位而不是第1位。

  • 将下列二进制化为十进制:
    (1011)2=1x23+0x22+1x21+1x20=11;
    (1111)2=15;

十进制即把上述方法反过来用,简易方法即将数字反复除以2取余数。
对于八进制转换十进制:(A3A2A1A0)8=A3×83+A2×82+A1×81+A0×80
十进制转换为八进制:不断除8取余。

整数的加减法

计算机做整数加减运算的操作数可以是8位、16位、32位甚至64位的。

Sign and Magnitude表示法

要用8个字节表示正数和负数,一种简单的想法是把最高位规定为符号位),0表示正1表示负,剩下的7位表示绝对值的大小,这称为Sign and Magnitude表示法。
-1:10000001
+1:00000001
这个表示法整数取值范围是-27到127-1,即-127~127。
计算机做加法运算需要处理以下逻辑:

  1. 如果两数符号位相同,就把它们的低7位相加,符号位不变。如果低7位相加时在最高位产生进位,说明结果的绝对值大于127,超出7位所能表示的数值范围,这称为溢出,这时通常把计算机中的一个标志位置1表示当前运算产生了溢出。
  2. 如果两数符号位不同,首先比较它们的低7位谁大,然后用大数减小数,结果的符号位和大数相同。
    在使用这种表示法时计算机做加减运算需要处理很多逻辑:比较符号位,比较绝对值,加法改减法,减法改加法,小数减大数改成大数减小数……效率很低。
1’s Complement表示法

这是一种二进制补码表示法,用十进制数字表示正数和负数。如用三位十进制数字表示:

数值 补码
-499 500
-498 501
,
-1 998
0 999
0 0
498 498
499 499

使用这种表示方法相加相减更加容易:比如150-40,负数用9的补码表示,减法转换成加法,40表示为999-40=959,150+959=1109,1109-999=110。
**优势:**不需要把符号和绝对值分开考虑,正数和负数的加法都一样算加法,只要有一套加法器电路,再有一套把每个字节数取反的电路,就可以做加法和减法运算。

2’s Complement表示法

我们发现1’s Complement表示法中0的表示并不唯一,从而引入了2’s Complement表示法:正数不变,负数先取反码再加1。如4:00000100;-4:对00000100取补码,11111111-00000100+1=100000000-00000100。
8个bit采用2’s Complement表示法的取值范围是-128~127。
计算过程可能会有溢出:在相加过程中最高位产生的进位和次高位产生的进位如果相同则没有溢出,如果不同则表示有溢出。

有符号数和无符号数

前面的三种表示方法都可以表示负数和整数,称为有符号数。如果8个bit全部表示正数则取值范围是0~255,这称为无符号数。
计算机的加法在做完计算之后,根据最高位产生的进位设置进位标志,同时根据最高位和次高位产生的进位的异或设置溢出标志。若程序把它理解成有符号数加法,下一步就要检查溢出标志,如果程序把它理解成无符号数加法,下一步就要检查进位标志。

浮点数

浮点数在计算机中的表示是基于科学计数法的。下面列出一种浮点数模型由三部分组成:符号位、指数部分(表示2的指数次方)和尾数部分(尾数部分只表示小数点后的数字):

比如表示12的浮点数,12=(1100)2,将尾数有效部分移到小数点后:0.1100x25,

若指数部分为小数,可以规定指数部分第一位为符号位。
为了使浮点数的表示唯一,规定尾数部分的最高位必须是1,也就是说尾数必须以0.1开头,对指数做相应的调整,这称为正规化。注意在做浮点运算时要注意精度损失问题。
在绝大多数平台上,一个浮点数的所有bit是0就表示0值。

发布了39 篇原创文章 · 获赞 4 · 访问量 1119

猜你喜欢

转载自blog.csdn.net/qq_41403559/article/details/104327080