黑马程序员技术交流社区

标题: 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