二进制:关于10000000如何表示-128的问题

2024-11-06 19:07:51
推荐回答(5个)
回答1:

对的,有符号数 最高位是符号位。于是,计算机里 +0 和 -0 编码是不一样的。计算机里负数用补码表示,为的是减法可以用加法器执行。

10000000 那个1是表示负数,但整个值是 -128,这是特殊的规定。
就这一个值特殊。不能用寻常的减1求反判断。这是为了让有符号数,多1个有用的数据点,让可描述的数值范围从 -127 - +127 扩大到 -128 - +127。只不过 把 -0 和 +0 合为 +0。

当然,一定要追问 怎么算出 -128 的。需要增加1个更高位来考虑。考虑完了,再去掉那位。

负数在现代计算机里一般用补码表示:最高位是符号位,其余位为数字的原码取反+1
1000 0000还原为原码:

最高位是1,表示负数,剩余的各位取反 111 1111 再+1 得到 1000 0000, +128的原码,整个数为-128

负数

求负整数的补码,将其对应正数二进制表示所有位取反(包括符号位,0变1,1变0)后加1 。
同一个数字在不同的补码表示形式中是不同的。比如-15的补码,在8位二进制中是11110001,然而在16位二进制补码表示中,就是1111111111110001。以下都使用8位2进制来表示。

扩展资料

与十进制

(1)二进制转十进制

方法:“按权展开求和”

【例】:

规律:个位上的数字的次数是0,十位上的数字的次数是1,......,依次递增,而十

分位的数字的次数是-1,百分位上数字的次数是-2,......,依次递减。

注意:不是任何一个十进制小数都能转换成有限位的二进制数。

(2)十进制转二进制

· 十进制整数转二进制数:“除以2取余,逆序排列”(除二取余法)

【例】:

89÷2 ……1

44÷2 ……0

22÷2 ……0

11÷2 ……1

5÷2 ……1

2÷2 ……0

1

· 十进制小数转二进制数:“乘以2取整,顺序排列”(乘2取整法)

【例】: (0.625)10= (0.101)2

0.625X2=1.25 ……1

0.25 X2=0.50 ……0

0.50 X2=1.00 ……1

.十进制负数转二进制:“先取正数的二进制值,再取反,加1”

【例】:(-31)10 = (1)2

31的二进制数为11111,取反00000,加1得1。

与八进制

二进制数转换成八进制数:从小数点开始,整数部分向左、小数部分向右,每3位为一组用一位八进制数的数字表示,不足3位的要用“0”补足3位,就得到一个八进制数。

八进制数转换成二进制数:把每一个八进制数转换成3位的二进制数,就得到一个二进制数。

八进制数字与十进制数字对应关系如下:

000 -> 0 | 004-> 4 | 010=8

001 -> 1 |005 -> 5| 011=9

002 -> 2 |006 -> 6 | 012=10

003 -> 3 |007 -> 7 | 013=11

【例】:将八进制的37.416转换成二进制数:

3 7 . 4 1 6

011 111 .100 001 110

即:(37.416)8 =(11111.10000111)2

【例】:将二进制的10110.0011 转换成八进制:

0 1 0 1 1 0 . 0 0 1 1 0 0

2 6 . 1 4

即:(10110.0011)2 = (26.14)8

与十六进制

二进制数转换成十六进制数:二进制数转换成十六进制数时,只要从小数点位置开始,向左或向右每四位二进制划分一组(不足四位数可补0),然后写出每一组二进制数所对应的十六进制数码即可。

十六进制数转换成二进制数:把每一个十六进制数转换成4位的二进制数,就得到一个二进制数。

十六进制数字与二进制数字的对应关系如下:

0000 -> 0 0100 -> 4 1000 -> 8 1100 -> C

0001 -> 1 0101 -> 5 1001 -> 9 1101 -> D

0010 -> 2 0110 -> 6 1010 -> A 1110 -> E

0011 -> 3 0111 -> 7 1011 -> B 1111 -> F

【例】:将十六进制数5DF.9 转换成二进制:

5 D F . 9

0101 1101 1111 .1001

即:(5DF.9)16 =(10111011111.1001)2{十六进制怎么会有小数点}

【例】:将二进制数1100001.111 转换成十六进制:

0110 0001 . 1110

6 1 . E

即:(1100001.111)2 =(61.E)16

参考资料:百度百科 二进制

回答2:

给你转一篇文章,这个应该可以消除你的疑惑:

C 语言关于补码的解释及误区
在中文的C 语言教材中,总有些人被原码、反码、补码弄得晕头转向,(其实我也觉得反码之类的东西是有些人自作聪明弄出来的定义,反而弄得 人晕头转向,有时候简单挺好)

正文开始: 关于补码,看过一些书籍和网文,基本都是在"求反加一"的方法、步骤上 反复强调,而对于补码的本质和定义,讨论的不足。这就对初学者的造成了误 导,使得很多人都纠结在-128 的补码求取过程中。 关于反码和原码,大家都是在郑重其事的讲解,其实,学过的人都知道, 它们的重要性是0!

做而论道把自己对于补码的认识写在下面,但愿对读者有些帮助:

加法器 计算机里面,只有加法器,没有减法器,所有的减法运算,都必须用加法 进行。 即:减去某个数字(或者说加上某个负数)的运算,都应该研究如何用加法 来完成。 模、补数 在日常生活当中,可以看到很多这样的事情: 把某物体左转90 度,和右转270 度,在不考虑圈数的条件下,最终的效果 是相同的; 把分针倒拨20 分钟,和正拨40 分钟,在不考虑时针的条件下,效果也是 相同的; 把数字87,减去25,和加上75,在不考虑百位数的条件下,效果也是相 同的; …。 上述几组数字,有这样的关系: 90+270=360 20+40=60 25+75=100 式中的360、60 和100,就是"模"(也可以理解成"进制")。 式中的90 和270、20 和40,以及25 和75,就是一对对"互补"的数字。 知道了"模",求某个数字的"补数",就是轻而易举的了: 如果模为365,数字120 的补数为:365-120=245。 用补数代替原数,可把减法转变为加法。出现的进位就是模,此时的进位, 就应该忽略不计。 二进制数的模 前面说过的十进制数25 和75,它们是2 位数的运算,模是100,即1 的后 面加上2 个0。 如果有3 位数参加运算,模就是1000,即1 的后面加上3 个0。 这里的1000,是十进制数的一千,可以写成10^3,即10 的3 次方。 推论:有多少位数参加运算,模就是在1 的后面加上多少个0。 对于二进制数字,模也是这样推算。 如果是3 位二进制数参加运算,模就是1000,即1 的后面加上3 个0; 那么当8 位二进制数参加运算,模就是1 0000 0000,即1 的后面加上8 个0。 16 位二进制数参加运算,模可就大了,是1 的后面加上16 个0。 注意:这里提到的1、0,都是二进制数。 8 位二进制数的模可以按照十进制写成2^8,即256。 16 位数二进制数的模,就是2^16,按照十进制,它就是65536。 二进制数的补码 求二进制数的补数,目的是往计算机里面存放。 在计算机里面,存放的数字什么的,都称为机器码;那么二进制形式的补 数,也就改称为补码了。 一般情况下,都是以8 位二进制数来讨论补码,少数也有用16 位数的。 计算时加上正数,是不需要进行求取补数的;只有进行减法(或者加上负 数),才需要对减数求补数。 补码就是按照这个要求来定义的:正数不变,负数即用模减去绝对值。 已知一个数X,其8 位字长的补码定义为: /X 0=X=+127;正数和0 的补码,就是该数字本身 [X]补=| ^8-|X|-128=X 0;负数的补码,就是用1 0000 0000(2 的8 次方),减去该 数字的绝对值 例如X=-126,其补码为1000 0010,计算方法如下: 1 0000 0000 -0111 1110 - 1000 0010 可以看出,按照补码的定义来求补码,概念十分清晰,方法、步骤也是十 分简单的。 应用补码进行计算 用补码计算:83-25=58。 83-都变
成补码,再用加法运算-0101 0011 -25-1 0000 0000-0001 1001-+1110 0111 -- 58-忽略进位1,结果就是正确的-[1]0011 1010 计算结果如果超出了-128~+127 的范围,结果将是错误的,这是没有办法 纠正的。 应用补码进行计算,完全符合前面介绍的"用补数可把减法转换成加法"的 做法,只要忽略进位(这个进位1,就是求补的时候,加进去的1 0000 0000 中 的1),结果就是正确的。

这些关于补数、补码的定义、方法、步骤,读者如果看懂了前面的文字, 相信大家自己都可以总结出来。 那么为什么总有些网友要提出关于求取补码的问题呢? 在做而论道看来,就是因为很多教材和网文都在这个问题上"画蛇添足"。 关于补码的蛇足 补码出现后,后人又补充了不少"蛇足":符号位、求反加一、原码、反码.。 下面的表格给出了一些8 位数的补码。 -符号位 从这个表格中,可以看出特点:正数的最高位都是 0,负数的最高位都是 1。 这样一来,有人就把最高位理解成了符号位。说什么是规定的用0 代表正 号,.。并且郑重其事的补充说明:"符号位也参加运算"。真能忽悠!卖拐、卖 车的都甘拜下风。 其实,前面说过的补数和补码的定义式里面,根本就没有什么符号位。这 最高位的1、0 是自然出现的,并不是由人来规定的。 -求反加一 负数补码的后面七位,也可以看出一个不完全的规律:它们和绝对值之间 存在着"求反加一"的关系。 于是,又有人推出了这个不同于定义式的算法。 -原码和反码 由于使用"求反加一"来求取补码,顺便又引出了原码和反码两个垃圾概念。 其实,"求反加一"的计算方法只是适用于计算二进制形式的补数,它并不 是通用的。 并且把"求反加一"用于求-128 的补码,有个溢出的现象,很多人都在这里 被弄瘸了很长时间。 原码和反码也只不过是"人工"进行"求反加一"时的中间过程,在计算机里 面根本是不存在的,它们也就没有丝毫用处。 做而论道的建议 求取补码,就按照定义的规定,负数采用"模减去绝对值"的方法来求,这 是求补数的通用方法,适合于各种进制、各种大小的数字。 不要用求反加一的方法,也就不用理会原码和反码了,也不牵涉符号位的 问题。 以后的计算,也就没有必要特殊说明:"符号位一起参加运算.",因为根本 就没有什么符号位。

如果把原码和反码、符号位等等垃圾概念,从计算机的书中删减掉,学习 补码将会省力不少。

回答3:

对的,有符号数 最高位是符号位。于是,计算机里 +0 和 -0 编码是不一样的。
计算机里负数用补码表示,为的是减法可以用加法器执行。

10000000 那个1是表示负数,但整个值是 -128,这是特殊的规定。
就这一个值特殊。不能用寻常的减1求反判断。这是为了让有符号数,多1个有用的数据点,让可描述的数值范围从 -127 - +127 扩大到 -128 - +127。只不过 把 -0 和 +0 合为 +0。

当然,一定要追问 怎么算出 -128 的。需要增加1个更高位来考虑。考虑完了,再去掉那位。

回答4:

关于 1000 0000 如何表示-128 的问题

问一下,有符号的二进制数最高位是符号位。

所以对于 1000 0000 那个 1 是表示负数。

那么这个数求它的原码是用 000 0000 减去 1,再求反。

000 0000 - 1 = 111 1111 求反就是 000 0000。

这个数 1000 0000 不就表示 0 了吗? 为什么还是-128呢?

网上说直接对 1000 0000 减1,再求反就是 1000 0000,即为-128。

这两种说法很矛盾啊!求大神解释下啊!

--------------------------

你的问题,直接击中了“符号位 01 原码反码取反加一”的关键错误。

零!

天下,只有一个零!

零既不是正数,也不是负数。

这些常识,小学生都知道的。

但是,计算机大佬,异想天开的,硬给零加上了“符号位”!

这就为一个零,编造了两个代码(+0、-0)!

原码和反码,都是这样的。

这种人,就是想要上天哪!

如果他们读书读到小学毕业,肯定就不会这么胡编乱造的。

原码反码中,一个零占了两个位置,因此,就少表示了一个数值。

于是,在八位的原码反码中,就都没有-128 的位置了。

因此,这两种乱码,计算机,是不能用的。

在计算机系统中,数值,一律采用补码表示和存储。

怎么求补码? 取反加一? 

-128,没有原码反码,拿什么取反? 拿什么加一?

呵呵,“取反加一”就碰壁了,碰的 Duang、Duang 的!

--------------------------

-128 的八位补码是 1000 0000。

必须使用【补码定义式】才能求得:

步骤如下所示:

  负数的补码 = 2^n - | 负数 | 

        =  256 - 128

        = 128 = 1000 0000B。

由补码求真值,也是用这个式子颠倒一下,非常简单。

--------------------------

下面说说“符号位”吧。

符号位 01 代表正负号,这是在介绍原码反码时,确定的。

当时,还说“符号位也参加运算”。

但是,用原码或反码做计算,结果都不正确。 瞧这脸打的!

用补码来计算,虽然正确,但是也不好说“符号位能参加计算”。

因为,补码,并非是由原码反码推导出来的。

补码,是用定义式求出来的。

而在定义式中,根本就没说:补码最高位,是什么特殊的位!

在此,就可以说:补码,并没有符号位。

补码的最高位为 1 时,确实是代表负数,这不假。

大家都知道,把正负号改变一下,就可以改变某个数值的正负。

如,把 +5 变成-5,就是仅改变一下正负号。

对于原码反码,把“最高位”改一改,就可以做到这些事。

--------------------------

对于补码,你需要改动的,就不仅仅是“最高位”了!

要把正数的补码,变成负数的补码,比如下面这两个:

  [+5]补 = 0000 0101,

  [-5]补 = 1111 1011,

就必须【把全部的位都取反,然后在末位加一】。

这就是说:补码的符号,与全部的位,都有关。

谁要说“补码的最高位是符号位”,他就是骗人了。

--------------------------

另外,网友“装正经”转发那的篇文章,就是我多年前写的。

文中的“做而论道”就是我在“拜毒”这里的昵称。

原文出处,本来就是这里的博客。

但是,这里的全部博客,无缘无故的都关闭了。

我写的几百篇博文,都看不到了。

大家可以搜索“C 语言关于补码的解释及误区”查看网上转发的二手博文。

回答5:

这种东西……
我尝试用一种简单的方法来解释?

假设你看不到的地方可以无限进位无限退位,那么
10000000 就是 00000000 - 10000000 对吧,换成十进制就是 0 - 128
是 -128 没错吧?
就比如 11111111 其实是 00000000 - 00000001,换成十进制就是 0 - 1 所以是-1。二进制的计算,你看最后的0不够减,就不断往前借位,借到最后到了我刚刚说的“看不到的地方”,拿到了1,然后……你懂的,变成11111111了。