C语言之反码、补码

补码与反码

在计算机中对数据进行运算操作时,
符号位该如何表示呢?
是否也同数值位一道参加运算操作呢??
如果参加,会给运算操作带来什么影响呢???
为了妥善地处理好这些问题,就产生了把 符号位数值位 一起来编码来表示相应的数的各种表示方法,如原码、补码、反码、移码。
为了区别一般书写表示的数和机器中这些编码表示的数,通常将前者称为 真值 ,后者称为 机器数或者机器码(带符号的)

机器数或者机器码(最高位存放符号,正数0 负数1)(以+1 -1为例)00000001 10000001
真值比如 00001010的真值为= +000 0001 =+10

废话不多说,下面讲解一下 原码 补码 和 反码,不足之处望指正。

  1. 原码:原码(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. 反码:原码变反码很容易实现 (最高位为符号位)
    -------------------------正数的反码是其本身 负数的反码是在其原码的基础上,符号位不变,其余各位取反
例子原码 --------->>>反码
+10000 0001--------->>>0000 0001
-11000 0001--------->>>1111 1110
  1. 补码:在计算机系统中,数值一律用补码来表示和存储。可以将符号位和数值位统一处理。
    {
    正数的补码就是其本身,
    负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+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.

-------------------------------------------------------------------参考计算机组成原理一书

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值