补码与反码
在计算机中对数据进行运算操作时,
符号位该如何表示呢?
是否也同数值位一道参加运算操作呢??
如果参加,会给运算操作带来什么影响呢???
为了妥善地处理好这些问题,就产生了把 符号位 和 数值位 一起来编码来表示相应的数的各种表示方法,如原码、补码、反码、移码。
为了区别一般书写表示的数和机器中这些编码表示的数,通常将前者称为 真值 ,后者称为 机器数或者机器码(带符号的)
机器数或者机器码(最高位存放符号,正数0 负数1) | (以+1 -1为例)00000001 10000001 |
---|---|
真值 | 比如 00001010的真值为= +000 0001 =+10 |
废话不多说,下面讲解一下 原码 补码 和 反码,不足之处望指正。
- 原码:原码(true form)是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。{整数}
/*十进制转换为二进制*/ #include<stdio.h> int main(){ int n,x=0,a[1000]; printf("请输入转换的数:\n"); scanf("%d",&n); while(n) { a[x++]=n%2; n/=2; } --x; printf("其二进制数为:\n"); while(x>=0) printf("%d",a[x--]); }
比如+10(正10) 首先转化为8位二进制 为 00001010 其原码为 0001010
-10(负10) 其原码为10001011
- 原码的缺点:不能直接参加运算,易出错
such as :1+(-1)= 0
如果用其原码参与运算,过程如下
0000 0001+1000 0001=1000 0010 换算成10进制结果为 -2 结果是错误的
- 反码:原码变反码很容易实现 (最高位为符号位)
-------------------------正数的反码是其本身 负数的反码是在其原码的基础上,符号位不变,其余各位取反
例子 | 原码 --------->>>反码 |
---|---|
+1 | 0000 0001--------->>>0000 0001 |
-1 | 1000 0001--------->>>1111 1110 |
- 补码:在计算机系统中,数值一律用补码来表示和存储。可以将符号位和数值位统一处理。
{
正数的补码就是其本身,
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1 (即在反码的基础上+1)
}
就以钟表为例 现在为标准时间3点整 可是有一只表已经7点了,为了校准时间,可以有两种方法 ① 时针逆时针退7-3=4格 ② 时针顺时针向前拨 12-4=8格 此时还可以用 数学表达式(同余式) -4 = +8 来表示
-4 = +8(mod 12) 有兴趣的童鞋可以详细看看数学!!!
》》》此时咱们可以讨论一下char类型,范围的问题。。。
- 众所周知char的范围类型为 -128~127,那这是为什么那是这个范围呢?
- 八位 (八个bit占位)最大(1111 1111)即0到255之间的数 共有256个数
- 同时我们也要存负数 所以128对 即最大是-128~128
- 但是 但是 但是 规定1000 0000 为-128
- 所以取值范围为-128~127(超过这个范围的 以补码形式存储 显示)
- ASCII码中利用8个bit,从0(0000 0000)到127(0111 1111),每个二进制数均对应一个特定的字符,char 数据类型 能有效接收这128个字符,但是无论传给什么数据类型,他们最终都以二进制数保存。
- 当输出要求为%c,编译器则认为把存储的二进制转换为对应的字符输出
- 当输出要求为%d,编译器则认为把存储的二进制转换为十进制输出
从补码的意义上去理解
∵256-128=256+(-128)的补码
又∵256-128=128
∴256+(-128)的补码=128
∴ -128)的补码 =256-128=128
数学上,128=1000 000 所以规定**-128**的补码为1000 0000
(重点 圈起来)超出其范围举例:
①
char a = 128时,赋值给a后,a代表的存储空间中存储的是1000 0000,但取出来的时候,因符号位是1,系统认为他是一个负数的补码,1000 0000其实就是-128的补码,故第一个输出的是-128
②
char a = -129时,a代表的存储空间是0111 1111,因为,-129的原码
是1 1000 0001,反码是1 0111 1110 ,补码是1 0111 1111.系统就读低(后)8位,也就是0111 1111,认为是一个正数,而0111 1111是127的补码,故输出127.
-------------------------------------------------------------------参考计算机组成原理一书