您的位置:首页 > 职场人生

黑马程序员----C 语言学习笔记之机器数、真值、原码、反码、补码

2015-09-23 21:32 525 查看
------Java培训、Android培训、iOS培训、.Net培训--------

一、机器数和真值

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]


为什么在C语言整型变量中,最小的负数是100000000000000的形式,而不是1111111111111111?

最大值的二进制为0111 1111 1111 1111,可以计算一下这个二进制的值,它实际上等于1000 0000 0000 0000-1,也就是2^15-1。

对于最小值呢,因为数据在内存中是以补码的方式存储的,它的最小值的二进制实际上是 1000 0000 0000 0000,可以实际判断一下,这是最小的负数,根据这个二进制数可以求出它的取反为 0111 1111 1111 1111,再加1为1000 0000 0000 0000,也就是-2^15。即 -2^14(1000 0000 0000 0001)补>>2 = -2^15(1000 0000 0000 0000)补, 符号位不变,低位右移舍弃
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: