c语言为什么要用补码,什么是补码为什么要用补码
什么是补码为什么要用补码?
1.计算机中为什么使用补码形式:
电脑里面的数值用补码来表示,一方面是为防止0有2个编码,另外是为了将减法运算用加法运算表示出来,以达到简化电路的作用(有负数的概念,减法也可以换算为加法)。
为什么用补码表示有符号整数?8位整数表示的范围是-128~127,却不是-127~128呢?为什么二进制10000000在原码以及反码中表示0,在补码中它不表示0,确保0表示的唯一性。它为什么表示负数,而不是整数。因为它符号位是1呀,表示负数呀,正确!继续,+128我们用补码怎么表示,包括符号位,表示为010000000,超过了2个字节,如果截取低8位,那么是10000000,最高位(符号位)是1,表示的是一个负数,再看看-128的机器码是多少,原码110000000,反码101111111,补码110000000,截取低8位即10000000,表示的是一个负数。学了计算机逻辑原理,其实这样做是由于物理条件关系。因为运算器里这样做更容易实现计算。
2.
int x=-70;
int y=2;
int z=x>>y
z的值是多少?主要是不明白负数移位该怎么算?
在C语言中 int 是两个字节所以 70在计算机中表示为 0000 0000 0100 0110
-70用补码表示即 1111 1111 1011 1010
右移2位 C语言中采用的是算术右移
所以补进位和原符号位相同即 1111 1111 1110 1110
取反加一求它的相反数 0000 0000 0001 0010 等于 17
所以右移后的结果是 -17
有个规则如果左移1位相当于乘以2 右移1位相当于除以2 取整
我们验证一下用-70除以2*2 结果取整正好是我们推算的 -17
在C++中 int 是四个字节但是结果也是一样的原因自己可以推算一下
3. 在8位运算中65-15具体怎么通过补码计算呢
15的原码是0000 1111 补码也是0000 1111
因为是正数符号位(最高位)为0
-15的原码是1000 1111(←注意这个地方你弄错了)符号为为1表示负
反码就是 1111 0000(注意原码反码补码之间转换的时候千万不要把符号位考虑进去) 补码就是 1111 0001
如果你已经求出了15的补码这里有个简便的方法求-15的补码:
直接把15的补码包含符号位一起求反即可即
15补码 1111 0001 那么-15的补码 0000 1110
补码计算的时候符号位是要直接参与二进制运算了而不是单独考虑
所谓多余8位的进位舍去其实就是比如补码1111 1111再加任意非0数原来这个补码表示的数就会发生溢出(比如加上 0000 0001原先符号位1表示负数加后表示正数)
这里也许你觉得没有必要因为本身只能容纳8位多余的当然要舍去
可是你可能不知道如果是反码进行运算的话不是舍去多余进位而是把多余的进位加到最低位称为循环进位
4。补码溢出怎么处理
要看你处理数据的范围,比如我用8位二进制记录数据。
只能储存-128~127之间的数据,如果超过127或小于-128就会溢出。
比如127+1=-128 就是这个道理
就好象最大值和最小值连成了一个环,超过了循环计算
这样做才使得数据有规律性和周期性
为了实现这个所以 补码是舍掉进位 而反码是循环进位 前面说过了
解决的办法就是 如果8位的数据不过你就用16位的
如果 整型不够就用长整型撒 实在不行就用浮点型的
用[x]表示机器数(原码),x是真值(二进制)
x=+0.1001,则[x]原=0.1001
x=-0.1001,则[x]原=1.1001
对于0,原码中有“+0”、“-0”之分,故有两种形式:
[+0]原=0.000…0
[-0]原=1.000…0
采用原码表示法简单易懂,但它的最大缺点是加法运算复杂。这是因为,当两数相加时,如果是同号则数值相加;如果是异号,则要进行减法。而在进行减法时还要比较绝对值的大小,然后大数减去小数,最后还要给结果选择符号。
为了解决这些矛盾,人们找到了补码表示法。什么是补码?机器数的补码可由原码得到。如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在未位加1而得到的。
负数用补码表示时,可以把减法转化为加法。这样,在计算机中实现起来就比较方便
[x]补= { x 1>x≥0
{ 2+x=2-|x| 0≥x≥-1
x=+0.1011,则[x]补=0.1011
x=-0.1011,则[x]补=10+x=10.0000-0.1011=1.0101
对于0,[+0]补=[-0]补=0.0000 (mod 2)
例子中是以定点小数为例。
补码的原理可以用钟表来描述
如设标准时间为4点正;一只表已经7点了,为了校准时间,可以采用两种方法:一是将时针退 7-4=3 格;一是将时针向前拨12-3=9格。即7-3和7+9(mod12)等价,因此,把负数用补码表示的mod2操作,可以把减法转化为加法。
c语言为什么要用补码,什么是补码为什么要用补码相关推荐
- 计算机采用补码存储数据吗,为什么计算机用补码存储数据?
来自公众号:漫话编程 关于作者:漫话编程,是一个通过漫画+音频的形式讲解枯燥的编程知识的公众号.致力于让编程变得更有乐趣. img img img img img img img 我们知道,计算机只认 ...
- 原码、反码、补码,带你深入理解计算机的补码运算原理(附图片解说过程),为什么计算机中数据要以补码的形式存储呢?解释补码运算规则的合理性。
一.为什么计算机中的数据以补码的形式存储? 计算机更擅长加法运算,减法运算是在计算机处理器的加法器的基础上而实现的,既然计算机更擅长加法运算,那么计算机的设计者当然就只能在加法器的基础上引入" ...
- C语言 枚举,进制,原码,反码,补码,移码,结构体
该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/104294089 枚 ...
- c或c++语言什么时候用补码来运算,C/C++(基础编码-补码详解)
两个数的交换 1.引入第三者. 2.求和运算,求差.(这样会产生内存溢出) 3.异或运算 a = a^b; b = a^b; a = a^b; 8b(bit位) = 1B(Byte=字节)//最小单位 ...
- java反码补码原码作用_java原码补码反码关系解析
本文为大家解析了java原码补码反码的关系,供大家参考,具体内容如下 原码:不管源数据是十进制还是十六进制,统统将数字转成二进制形式 反码:把原码的二进制统统反过来,0变成1,1变成0 补码:负数的反 ...
- 补码乘法实验原理_你真的理解补码吗?
小编导读 "在计算机系统中,数值一律用补码来表示." 教科书上虽然这么说,但是却没有告诉我们为什么,今天小编就带大家一探究竟! 计算机数值运算的基础硬件就是加法器,所以我们就从加法 ...
- -128的补码及原码、反码、补码
一.原码 一个字节占8位: 一个字长为n的机器数能表示不同的数字的个数是固定的2^n个,n=8时2^n=256: 用来表示有符号数,数的范围就是 -2^(n-1) ~ 2^(n-1)-1,n=8时,这 ...
- matlab 二进制补码转十进制,matlab十进制与二进制补码之间的转换
转载:http://blog.xdnice.com/blog40543i59178.html matlab提供了一个系统函数dec2bin,可以用来进行十进制数的二进制转换,不过功能有限! 在matl ...
- 计算机存储二进制都是用补码,为什么计算机存储的是二进制补码?
原码: 最高位为符号位..0代表正数 1 代表负数 +1:0000 0001 -1:1000 0001 +0:0000 0000 -0: 1000 0000 问题: 1.0这个数值在存储的时候,有2种 ...
- 计算机中补码能算减法的原因和补码的由来,最强逻辑解析
** 原码.反码.补码: ** 这里的码都是二进制码,正数的原码.反码和补码都一样,负数的反码是符号位不变,其它位都取反,补码是反码+1 正数的符号位为0,负数的符号位为1,比如你有一个字节,也就是8 ...
最新文章
- 实例:Linux EXT3文件系统下成功恢复误删的文件
- LiveVideoStack线上交流分享 (九) —— B站的QUIC实践简介
- 聊聊 KVC 和 KVO 的高阶应用
- python决策树分类鸢尾花_基于决策树—鸢尾花分类
- 边缘检测后去除噪点_Street Lanes Finder - 检测自动驾驶汽车的车道
- PropertyGrid 绑定动态的属性与值的集合
- linux 添加samba账户
- 递归实现二分搜索(python)
- 多模态简述(情感分析)
- asp.net千奇百怪的日历
- 软件体系结构 复习题
- 安徽大学2020年计算机考研,2020年安徽大学计算机专业课初试科目调整
- 【Python自然语言处理】读书笔记:第五章:分类和标注词汇
- 2.1 八边形绘制
- 魔兽世界的地形和建筑
- 页面结构图示例图_定义示例站点的页面结构
- Easyui后台管理界面设计
- Electron在win7上加载plotyjs失败的解决方法
- 烽火HG680-KA/KB_Hi3798MV310_红外蓝牙语音_开启无线开关_通刷固件包
- java缓存读写文件小例子