二进制中第一位0代表正;1代表负我知道,但是给你一个二进制的数比如101 那么转化成十进制应该是多少? 5?  但不是说首位为1应该是负的吗???

谁能给我讲讲这个首位什么时候作为符号,什么时候作为数字去计算?什么时候可以直接计算,什么时候需要取反?我怎么知道它是正数还是负数?

如果你有这种疑问,那就是没有高清概念有问题,我们只有在说计算机处理数时,会用0和1代表正负,这种数称之为机器数(包括原码,反码,补码);

一:表示法: 
1、正数5的表示法

假设有一个 int 类型的数,值为5,那么,我们知道它在计算机中表示为:

00000000  00000000  00000000  00000101

5转换成二制是101,不过int类型的数占用4字节(32位),所以前面填了一堆0。

2、负数-5的表示法

现在想知道,-5在计算机中如何表示?在计算机中,负数以原码的补码形式表达。

二、概念: 
1、原码:一个正数,按照绝对值大小转换成的二进制数;一个负数按照绝对值大小转换成的二进制数,然后最高位补1,称为原码。

比如 00000000  00000000  00000000  00000101 是 5的 原码。

10000000  00000000  00000000  00000101 是 -5的 原码。

备注: 比如byte类型,用2^8来表示无符号整数的话,是0 - 255了;如果有符号,最高位表示符号位,0为正,1为负,那么,正常的理解就是 -127 至 +127 了.这就是原码了,值得一提的是,原码的弱点,有2个0,即+0和-0(10000000和00000000);还有就是,进行异号相加或同号相减时,比较笨蛋,先要判断2个数的绝对值大小,然后进行加减操作,最后运算结果的符号还要与大的符号相同;于是,反码产生了。

2、反码:正数的反码与原码相同,负数的反码为对该数的原码除符号位外各位取反[每一位取反(除符号位)]。 
取反操作指:原为1,得0;原为0,得1。(1变0; 0变1)  
比如:      正数00000000  00000000  00000000  00000101

其反码还是 00000000  00000000  00000000  00000101

负数10000000  00000000  00000000  00000101

其反码则是 11111111  11111111  11111111  11111010。

反码是相互的,所以也可称:10000000 00000000 00000000 00000101  
和 11111111 11111111 11111111 11111010互为反码。 
备注:还是有+0和-0,没过多久,反码就成为了过滤产物,也就是,后来补码出现了。

3、补码:正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1. 
比如:         10000000  00000000  00000000  00000101  
的反码是:11111111  11111111  11111111  11111010。 那么,补码为:11111111  11111111  11111111  11111010 + 1  
等于 11111111  11111111  11111111  11111011 
 
备注:1、从补码求原码的方法跟原码求补码是一样的 ,也可以通过完全逆运算来做,先减1,再取反。 
        2、补码却规定0没有正负之分  
所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011。 
转换为十六进制:0xFFFFFFFB。 
 
三、再举一例 

我们来看整数-1在计算机中如何表示。假设这也是一个int类型,那么:

1、先取-1的原码:10000000  00000000  00000000  00000001

2、得反码:      11111111  11111111  11111111  11111110(除符号位按位取反)

3、得补码:      11111111  11111111  11111111  11111111

可见,-1在计算机里用二进制表达就是全1。16进制为:0xFFFFFF

四、主要知识点:  
正数的反码和补码都与原码相同。 
负数的反码为对该数的原码除符号位外各位取反。 
负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1

源码:优点在于换算简单 缺点在于两个零 加减法需要独立运算

反码:优点在于表示清晰 缺点在于两个零 加减法同样需要独立运算

补码:优点在于一个零 范围大  减法可以转为加法 缺点在于理解困难

下面是书上原文:  
原码表示法规定:用符号位和数值表示带符号数,正数的符号位用“0”表示,负数的符号位用“1”表示,数值部分用二进制形式表示。 反码表示法规定:正数的反码与原码相同,负数的反码为对该数的原码除符号位外各位取反。 补码表示法规定:正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1.

正零和负零的补码相同,[+0]补=[-0]补=0000 0000B

五、特殊情况-128 
1000 0000,那么,它的原码是什么呢?从补码求原码的方法跟原码求补码是一样的。先保留符号位其它求反:  1111 1111, 再加1,11000 0000, 超过了8位了。对,用8位数的原码在这里已经无法表示了。  
那么,回到原码处, 它的原码也是 1000 0000(超出的自动丢失),1000 0000 在原码表示什么呢? -0, 但补码却规定0没有正负之分。

转换一下思路,看看计算机里,是怎么运算的:

对于负数,先取绝对值,然后求反,加一

-128 -> 128 -> 1000 0000 -> 0111 1111 -> 1000 0000 
现在明确了吧 
所以, 8位有符号的整数取值范围的补码表示 1000 0000 到 0000 0000, 再到 0111 1111 即 -128 到 0, 再到 127 最终 -128 ~ +127

永远记住:程序里的加减法对 二进制是永远有效的。但是并不一定适合于真实世界。  
byte m = -128; byte q = 1; 
byte p = (byte)(m - q); //这一步其实编译器会报错,其实是发现越界了,我们强行转化为byte就可以看出结果。 
System.out.println( p); p的结果为:127

二进制中正负数表示和判断相关推荐

  1. 计算机底层的二进制表达——正负数与二进制转换方法及代码

    以下均是以64位计算机为例,故int类型是4字节,即32位二进制数. 文章目录 1 十进制数转为二进制 1.1 正数的二进制 1.2 负数的二进制 2 正负数与原码.反码.补码 2.1 原码 2.2 ...

  2. 知多一点二进制中的负数

    hello~亲爱的看官老爷们新年好~相信不少同学知道,如果要将一个数字转换为它的相反数,在 Javascript 中,除了在它前面加个-号之外,还可以对该数字进行取反,之后再加 1.前者(本质是 0 ...

  3. Java中正负数二进制表示

    在Java/C++中正数和负数的存储方式 正数是以正码的形式存储 负数是以补码的形式存储 正码(正数使用) 正码就是一个数的真实值 假设有一个 int (32位)类型的数,值为5,那么,我们知道它在计 ...

  4. FPGA中正负数和定点小数的表示方法

    在日常生活中,我们常常需要到正数与负数,比如南北两级气温常年为零度以下,这个时候我们就需要负数来表示温度.那么在FPGA工程里面也是这样,我们如果想要做温度监测工程,自然而然的就会需要到负数来表达零下 ...

  5. 学习-Java数组之foreach遍历数组之正负数数量统计

    第1关:学习-Java数组之foreach遍历数组之正负数数量统计 任务描述 相关知识 foreach 语句 编程要求 测试说明 任务描述 本关任务:使用 foreach 语句统计数组中正负数的个数. ...

  6. 正负数在计算机中的表示(原码反码补码)及位运算

    负数在现代计算机里一般用补码表示(正数也是) 正数补码就是它的原码 负数补码: 最高位是符号位,其余位为对应整数的原码取反再+1 如:1000 0000还原为原码:最高位是1,表示负数,剩余的各位取反 ...

  7. 计算机系统基础知识——详解二进制正负数及补码设计

    前言:关于二进制数的补码反码等各种码,上学时候只学会了死记硬背却还是一头雾水,不懂这样设计的意义.所以总是隔很多时间后还是记不住,今天就尝试用自己的理解解释下正负数以及补码的设计,如果有不对的地方或者 ...

  8. 二进制正负数转换和移位的规则详解

    1.转换规则 二进制整数都是以补码的形式出现的 正数的原码.反码.补码都相同 负数的反码就是正数的原码先把最高位变为1然后其余的位取反 负数的补码就是该负数的反码加1. 2.二进制的移位规则 < ...

  9. 二进制正负数的表示法

    数在数字电路中的二进制表示形式成为机器数,在通常的算术运算中,用"+"."-"表示正数和负数,而数字电路不识别"+","-&quo ...

最新文章

  1. Replace函数语法
  2. b树删除节点每次只能删一个吗_面试官,请不要问我B+树了!!
  3. 第四课.KNN电影推荐
  4. 首个波士顿动力机器狗买家秀:化身监工,确认路线后就能自动巡航
  5. C++网络编程(一)
  6. 第一章 Joomla!扩展开发:概况
  7. 广州创龙TMS320C6748 DSP开发板免费申请试用
  8. 神经网络测试时间计算机,卷积神经网络的时代到此结束了?
  9. 汇编解析(3)-nasm基础、物理地址
  10. background-clip与background-origin
  11. (转)Spring Boot(十一):Spring Boot 中 MongoDB 的使用
  12. 教育部官宣延期开学 这些教培机构在线捐课捐资
  13. 在.net中调用vb脚本(ITpro专用的vb脚本,而不是浏览器vb脚本)
  14. Zabbix监控内存
  15. bzoj3625:[Codeforces Round #250]小朋友和二叉树
  16. logstash收集TCP端口日志
  17. python: 上下文管理器(context manager)
  18. 堪培拉地理位置经纬度_澳大利亚的经纬度气候地形
  19. 【数学】线性增长,指数增长,对数增长,幂增长
  20. 目标检测00-10:mmdetection(Foveabox为例)-源码无死角解析(3)-头部网络bbox_head-训练过程

热门文章

  1. 苹果平替笔哪个牌子好?苹果平替笔推荐
  2. uniAPP开发 全教程
  3. Matlab histogram 画出十二种常见的混沌映射
  4. 【weex】h5weex-example
  5. Python之有趣的小程序——猜数字2.0
  6. Ubuntu右上角不显示网络的图标解决办法
  7. 深度学习第一讲之深度学习基础
  8. 基于51单片机的智能停车场车位收费系统原理图PCB
  9. java使用dbcp2数据库连接池
  10. 鼎捷 易飞 ERP 9.0.12.0 下载 算号 注册