黑马程序员技术交流社区
标题:
C语言学习笔记之机器数和真值
[打印本页]
作者:
chunhuayun
时间:
2015-9-23 21:40
标题:
C语言学习笔记之机器数和真值
一、机器数和真值
1.机器数 一个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数是【带符号】的,在计算机中用一个数的最高位存放符号,正数为0,负数为1。
例如,十进制数 + 3,计算机字长为8位,转换成二进制就是0000 0011,如果十进制-3,就是1000 0011
这里的0000 0011 和1000 0011就是机器数
2.真值 因为机器数第一位是符号位,所以机器数的形式值就不等于真正的数值,例如上面的有符号数1000 0011,其最高位1代表负号,其真正的数值是-3,而不是形式值131。所以为了区别,将带符号位的机器数对应的真正数值称为机器数的真值。
例如:
1000 0011 的真值 = -000 0011 = -3
1000 0011 的真值 = +000 0011 = +3
二、原码,反码,补码
【数据在计算机中是以补码存储的】
对于正数: 反码 = 补码 = 原码
对于负数: 反码 = 除符号位以外的各位取反,补码 = 反码 + 1
1.基本概念
1.1 原码:原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值,比如二进制的8位二进制:
[+1] = [0000 0001]原
[-1] = [1000 0001]原
1.2 反码
反码的表示方法是:
正数的反码是其本身,即原码
负数的反码是在原码的基础上,除符号位不变,其余各位取反
例如
[+1] = [0000 0001]原 = [0000 0001]反
[-1] = [1000 0001]原 = [1111 1110]反
1.3 补码
补码的表示形式是:
整数的补码是其本书,即原码
负数的补码是在其原码的基础上,除符号位不变,其余位取反,然后再加1
例如
[+1] = [0000 0001]原 = [0000 0001]反 = [0000 0001]补
[-1] = [1000 0001]原 = [1111 1110]反 = [1111 1111]补
2.为什么要引入补码的概念
【计算机能够做减法,减法的电路设计更简单】
人脑可以识别第一位是符号位,但是如果让计算机识别符号位,将会把电路设计的异常复杂。所以有人想出让符号位也参加计算的方法。这样,减一个数,就变成了加一个数的负数。计算机做加减法是最基本,最简单的操作。
例如:1 + (-1)
[+1] = [0000 0000 0000 0001]原 = [0000 0000 0000 0001]反 = [0000 0000 0000 0001]补
[-1] = [1000 0000 0000 0001]原 = [1111 1111 1111 1110]反 = [1111 1111 1111 1111]补
2.1 原码计算
0000 0000 0000 0001
+ 1000 0000 0000 0001
-------------------------
[1000 0000 0000 0010]原 = [-2] 错误结果
2.2 反码计算
0000 0000 0000 0001
+ 1111 1111 1111 1110
-------------------------
[1111 1111 1111 1111]反 = [1000 0000 0000 0000]原 = [-0] 不符合自然数表示
2.3 补码计算
0000 0000 0000 0001
+ 1111 1111 1111 1111
-------------------------
[0000 0000 0000 0000]补 = [0000 0000 0000 000]反 = [0000 0000 0000 0000]原 = [0]
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2