一、什么是原码、反码、补码?
原码
:10进制转换成2进制是原码,只不过正数的原码是本身符号位为0,负数的原码符号位为1(以下篇幅均以单字节为例:10进制1的原码是0000 0001,10进制-1的原码是1000 0001)。
反码
: 正数的反码是本身,负数的反码是负数的原码0变为1,1变为0 (-1的原码是1000 0001 它的反码就是 1111 1110,)。(注意负数求反码时候的符号位不参与变换)。
补码
: 正数的补码是本身,负数的补码就是负数的反码加一 (-1的原码是1000 0001 它的反码就是 1111 1110 它的补码就是 1111 1111)。
如果是有符号的数据类型,规定最高位(符号位)
正数为0,负数为1
(
规定!!!
)
总结:正数的原码,反码 ,补码三值合一, 负数的原码,反码,补码不同。
二:为什么要设置反码,补码?
有人会有疑惑为什么要用反码,补码,不直接用原码呢?先搞清楚一点反码补码原码是针对二进制数而言,计算机若用原码相加减,正数加正数不会出错,然而正数和负数原码相加就会出错。
引进补码的作用是为了让计算机更方便做减法
说白了,补码反码就是为了简化减法而来的,将减号化为负数 再将负数化为补码求加法 跟正数没关系 ,不管是正整数还是正小数,原码,反码,补码都全部相同。
三:Visual studio2013 查看存储;
-127 的原码: 1111 1111
-127的反码: 1000 0000
-127的补码: 1000 0001
事实证明计算机中负数是以补码存储的,也可以推广到,
计算机中所有数都是以补码形式存储的。
四:剖析本质:
1.单字节无符号的正数可以存储的范围就是 0~255 二进制表示( 0000 0000~1111 1111)
2.单字节有负号的整数可以存储的范围是-128 ~127 。
先看正数二进制能表示范围(0 000 0001 ~ 0 111 1111)即1~127
负数二进制能能表示的范围(1 000 0001 ~ 1 111 1111)即-127~-1
所还有个0 分为+0和-0 (0000 0000 表示+0,1000 0000 表示-0 表示-128)
-128 的原码: 1000 0000 (-0 表示-128 最高位1表示符号位)
-128的反码: 1111 1111 (除符号位外,其余各位对原码取反)
-128的补码: 1000 0000 (在反码的末位加1,从而使后7位发生溢出,
进位丢弃
,符号位不变十六进制 0x80)
今天,发生一件非常有趣的事情。
公司同事问了我一个问题:为什么 2.0 - 1.1 = 0.89999999 呢?不应该是 0.9吗?
原来是,他问了周围一圈的同事,都给他的是同一个回答,说这是精度问题。他百思不得其解,怎么就会产生精度问题呢。再问,就没人知道原因了。
然后,我就看到了他抱着一本厚厚的书在看。拿过来一看,是一本Java书,厚厚的六百多页,这还仅是第一卷。哟呵,这是准备大干一场啊。
例如:十进制 -9 (short int 型为16位)
原码(
负数
符号位为1):1000 0000 0000 1001;
反码(符号位不变,数值位分别 “按位取反” ):1111 11...
最近在学习位运算符时,发现
负数
在做带符号位的右移运算符时,结果与想象
中
的大不一样,经过查阅资料之后发现,原来这一切源自
负数
在
计算机
中
的储存方式
负数
在
计算机
中
是以补码的形式储存的
注意: 本文为了简化运算,二进制数都是用一个字节——8个二进制位说明
1 一些概念
在进行问题探究之前,先了解一些概念
1.1 原码
原码就是符号位加上真值的绝对值,即8位二进制数的第一位是符号位,其余位表示值
+1(...
------------------------------------------------------
负数
的二进制表示-----------------------------------------------------------------------------------------------------
2.3 整型数据2.3.1 整型常量在C语言程序
中
,整型常量可以用十进制、八进制和十六进制等形式表示。十进制基本常量用一串连续的数字表示,例如32767、-32768、0等。二八进制数也是用一串连续的数字表示,但其开头必须是数字“0”。例如010、011、016等都是合法的八进制数,与之对应的十进制数为8、9、14。因此,在C程序
中
不能在一个十进制数前随意添加数字“0”。例如,不能把十进制数11写...
1、在
计算机
中
如果一个二进制数据的最高位(最左边)是1,那么该数据肯定是一个
负数
;若最高位是0,则该数一定是一个正数。
2、
负数
在
计算机
中
存储
的都是补码。
3、
负数
的
存储
过程
1)先取
负数
的绝对值,求出该绝对值得二进制形式(原码);
2)原码取反得到反码(0变1,1变0);
3)反码+1得到补码。
例:-9的
存储
:
第一步:取-9...