二进制中正负数表示和判断

二进制中第一位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

二进制中第一位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


相关文章

  • 整数二进制补码的数学原理(two's complement)
  • 最近重新学习CPU体系结构,对使用二进制补码原理来消除带符号数和无符号数计算差异,以及整合减法运算器到加法运算器,从而简化CPU硬件设计的原理很感兴趣,所以特地思考了下,查看了一些网上关于two's complement的文章,但大部分还是 ...查看


  • 浮点数加减运算
  • 如果一个二进制浮点数的尾数的绝对值小于1并且大于等于0.5,(1>|尾数|≥0.5),那么这个二进制浮点数就是一个规格化的浮点数. 用二进制补码表示1个规格化的浮点数,并且规格化的浮点数的尾数只有一个符号位时: 规格化的浮点数的尾数是 ...查看


  • 第二章微机原理习题答案
  • 微机原理课后问题解答 第二章习题答案 一. 将下列十进制数转换成二进制数. (1)36 (2)0.628 (3)129.313 (4)1000 答:(1)100100 (2)0.1010 (3)129.313 (4)1111101000 二 ...查看


  • 信息的表示与存储
  • 1.4信息的表示与存储 计算机加工的对象是数据信息,而指挥计算机操作的是控制信息,因此计算机内部的信息可以分成二大类: ┌ 指令 ┌ 控制信息 ─┤ │ └ 控制字 信息 ┤ │ ┌ 定点数 │ ┌ 数值信息 ─┤ └ 数据信息 ─┤ └ ...查看


  • 浮点数计算实例
  • 浮点数表示法示例 目前C/C++编译器标准都遵照IEEE 制定的浮点数表示法来进行float,double 运算.这种结构是一种科学计数法,用符号.指数和尾数来表示,底数定为2--即把一个浮点数表示为尾数乘以2的指数次方再添上符号.下面是具 ...查看


  • 高中数学必修三算法初步习题
  • 必修三第一章算法初步 1.程序框图的运算结果为( ) 2.下面给出的是计算 1111+++...+的值的一个程序框图,其中判断框内应填入 24620 件是( ) 3.下列流程图中,语句1被执行的次数为( ) 4.下图给出的是计算 1111 ...查看


  • 原码反码和补码
  • 原码, 反码和补码 本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家学习计算 ...查看


  • 浮点数在计算机中的表示法
  • 浮点数 1. 什么是浮点数 在计算机系统的发展过程中,曾经提出过多种方法表达实数.典型的比如相对于浮点数的定点数(Fixed Point Number).在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置.货币的表达就可以使用这种 ...查看


  • 计算机组成与结构重点
  • 一.第一章 1.习题1.5如何划分计算机发展的五个阶段 根据电子计算机所采用的物理器件的发展,分为五代: 第一代:电子管计算机时代 第二代:晶体管计算机时代 第三代:集成电路计算机时代 第四代:大规模集成电路计算机时代 第五代:超大规模集成 ...查看


热门内容