以java中byte表示:2字节 8位,-128 首先首位1表示负数,128的正数为1000 0000(其实是-128),然后拼接为1 1000 0000,大于8位,则取低8位,为1000 0000,所以-128就是1000 0000, 就是计算机的-0,当然java可能对-0这样的表示有特殊处理(只是猜测);

首先说一句在8位2进制中超粗范围时候符号位不仅是符号位还是数值位,其实这时候数据是10000000
就是-128 就是所谓的-0,但是这里表示的-128 因为-0 +0补码表示是一样的所以使用00000000就是正零来表示零,这时候-128没有原码与反码,只有补码就是在计算机中保存的形式 10000000

-128,绝对值128,有符号数值范围是-127到+127,所以128的二进位是要用2字节内存保存,即16位,所以128的二进制码是(中括号只是表示一个字节)

[00000000][10000000]

以上是+128的原码,同时也是+128的补码

-128就是要+128的原码全部取反再加1:

+128的原码:[00000000][10000000]

取反就得到:[11111111][01111111]

再加1得到了:[11111111][10000000],这就是128的补码

*补码是数据在内存的储存形式

要求-128的原码,只需把+128的原码的最高位(符号位)更改就可:

+128的原码:[00000000][10000000]

-128的原码:[10000000][10000000]

*由原码求补码:除符号位外,其它全取反再加1

*所以,求负数的二进制补码至少有上述两种:

1.取绝对值,求绝对值二进码,全部取反再加一

2.取绝对值,求绝对值二进码,最高位改为1,除符号位外其它取反再加1

当然,如果保存-128的变量是4字节的,按上面方法可得到

-128原码[10000000][00000000][0000000][10000000]

-128补码[11111111][11111111][1111111][10000000]

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

补充:

8位二制码[10000000]的10进制值,如果储存它的变量是无符号类型,则取值是128

但如果按有符号来读取,则是-126

计算如下:[由补码求原码值]

补码:[10000000]

除符号位全取反得[11111111]

减1得到原码[11111110],这是-126的原码

所以,如果变量是 有符号short (短整型类,C语言中有),这个类型的变量取值范围是 -127到+127

则127+1不会等于128,而是-126:

[0111111]+[0000001]=[1000000](-126的补码)

但是,如果它是无符号short integer,则它的范围是0到255,127+1=128:

[0111111]+[0000001]=[1000000](正数128的8位2进制补码)

同理,  [1111111]按无符号short 读取是255,按有符号short   则是 -1

数值在计算机中表示形式为机器数,计算机只能识别0和1,使用的是二进制,而在日常生活中人们使用的是十进制,"正如亚里士多德早就指出的那样,今天十进制的广泛采用,只不过我们绝大多数人生来具有10个手指头这个解剖学事实的结果.尽管在历史上手指计数(5,10进制)的实践要比二或三进制计数出现的晚."

                                                                                                                                                                                               (摘自<<数学发展史>>有空大家可以看看哦~,很有意思的).为了能方便的与二进制转换,就使用了十六进制(2 4)和八进制(23).下面进入正题.

       数值有正负之分,计算机就用一个数的最高位存放符号(0为正,1为负).这就是机器数的原码了.假设机器能处理的位数为8.即字长为1Byte,原码能表示数值的范围为

(-127~-0 +0~127)共256个.

       有了数值的表示方法就可以对数进行算术运算.但是很快就发现用带符号位的原码进行乘除运算时结果正确,而在加减运算的时候就出现了问题:

( 1 ) 10- ( 1 )10 = ( 1 )10 + ( -1 )10 = ( 0 )10

(00000001)原 + (10000001)原 = (10000010)原 = ( -2 ) 显然不正确.

    因为在两个正整数的加法运算中是没有问题的,于是就发现问题出现在带符号位的负整数身上,于是引出了反码(对于正整数原码、反码是一样的,而负整数的反码是原码除最高位(符号位)外其余所有位的逐位求反。).反码的取值空间和原码相同且一一对应. 下面是反码的减法运算:

( 1 )10 - ( 1 ) 10= ( 1 ) 10+ ( -1 ) 10= ( 0 )10

(00000001) 反+ (11111110)反 = (11111111)反 = ( -127) 反= ( -0) 还有问题?!

( 1 )10 - ( 2)10 = ( 1 )10 + ( -2 )10 = ( -1 )10

(00000001) 反+ (11111101)反 = (11111110)反 = ( -126) 反 =( -1 ) 正确

问题出现在(+0)和(-0)上,在人们的计算概念中零是没有正负之分的.(印度人首先将零作为标记并放入运算之中,包含有零号的印度数学和十进制计数对人类文明的贡献极大).

于是又引入了补码(用最高位表示符号位,如果是0表示正数,如果是1表示负数,剩下的7位用来存数的绝对值的话,能表示128个数的绝对值,再考虑正负两种情况,128*2还是256个数。首先定义0在计算机中储存为00000000,对于正数我们依然可以像无符号数那样换算,从00000001到01111111依次表示1到127。那么这些数对应的二进制码就是这些数的原码(和原码一样)。到这里很多人就会想,那负数是不是从10000001到11111111依次表示-1到-127,那你发现没有,如果这样的话那么一共就只有255个数了,因为10000000的情况没有考虑在内。所以-1到-127不能那样表示(和原码的表示方法相同了,当然错了)。实际上,10000000在计算机中表示最小的负整数,即-128(原指-0的)。因为 -128+1=-127,那么把10000000加上1即10000001表示-127就容易计算很多了。这样,从10000001到11111111就刚好依次表示-127到-1。这就是所谓的补码。). 那么补码是怎样直接地转换得来呢?负数的补码就是对反码加一;而正数不变,正数的原码反码补码是一样的.在补码中用(-128)代替了(-0),所以补码的表示范围为:

(-128~0~127)共256个.

注意:当字长为8位时,(-128)没有相对应的原码和反码, (-128) = (10000000) (为什么?还有为什么8位整数表示的范围是-128~127,而不是-127~128呢?想过没有,为什么二进制10000000在原码和反码中表示0,在补码中它不表示0,保证了0表示的唯一性,但是它为什么表示负数,而不是正数,你也许会说,因为它符号位是1呀,表示负数呀,对,继续,+128我们用补码怎么表示,包括符号位,表示为010000000,超过了2个字节,如果截取低8位,那么是10000000,最高位(符号位)是1,表示的是一个负数了!我们再看看-128的机器码是多少,原码110000000,反码101111111,补码110000000,截取低8位即10000000,表示的是一个负数。)

补码的加减运算如下:

( 1 ) 10- ( 1 ) 10= ( 1 )10 + ( -1 )10 = ( 0 )10

(00000001)补 + (11111111)补 = (00000000)补 = ( 0 ) 正确

( 1 ) 10- ( 2) 10= ( 1 )10 + ( -2 )10 = ( -1 )10

(00000001) 补+ (11111110) 补= (11111111)补 = ( -1 ) 正确

所以补码的设计目的是:

⑴使符号位能与有效值部分一起参加运算,从而简化运算规则.

⑵使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计

所有这些转换都是在计算机的最底层进行的,而在我们使用的汇编、C等其他高级语言中使用的都是原码。看了上面这些大家应该对原码、反码、补码有了新的认识了吧!

-128,绝对值128,有符号数值范围是-127到+127,所以128的二进位是要用2字节内存保存,即16位,所以128的二进制码是(中括号只是表示一个字节)

[00000000][10000000]

以上是+128的原码,同时也是+128的补码

-128就是要+128的原码全部取反再加1:

+128的原码:[00000000][10000000]

取反就得到:[11111111][01111111]

再加1得到了:[11111111][10000000],这就是128的补码

*补码是数据在内存的储存形式

要求-128的原码,只需把+128的原码的最高位(符号位)更改就可:

+128的原码:[00000000][10000000]

-128的原码:[10000000][10000000]

*由原码求补码:除符号位外,其它全取反再加1

*所以,求负数的二进制补码至少有上述两种:

 1.取绝对值,求绝对值二进码,全部取反再加一

 2.取绝对值,求绝对值二进码,最高位改为1,除符号位外其它取反再加1

当然,如果保存-128的变量是4字节的,按上面方法可得到

-128原码[10000000][00000000][0000000][10000000]

-128补码[11111111][11111111][1111111][10000000]

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

补充:

8位二制码[10000000]的10进制值,如果储存它的变量是无符号类型,则取值是128

但如果按有符号来读取,则是-126

计算如下:[由补码求原码值]

补码:[10000000]

除符号位全取反得[11111111]

减1得到原码[11111110],这是-126的原码

所以,如果变量是 有符号short (短整型类,C语言中有),这个类型的变量取值范围是 -127到+127

则127+1不会等于128,而是-126:

[0111111]+[0000001]=[1000000](-126的补码)

但是,如果它是无符号short integer,则它的范围是0到255,127+1=128:

[0111111]+[0000001]=[1000000](正数128的8位2进制补码)

同理,[1111111]按无符号short 读取是255,按有符号short   则是 -1

   数值在计算机中表示形式为机器数,计算机只能识别0和1,使用的是二进制,而在日常生活中人们使用的是十进制,"正如亚里士多德早就指出的那样,今天十进制的广泛采用,只不过我们绝大多数人生来具有10个手指头这个解剖学事实的结果.尽管在历史上手指计数(5,10进制)的实践要比二或三进制计数出现的晚."

                                                                                                                                                                                               (摘自<<数学发展史>>有空大家可以看看哦~,很有意思的).为了能方便的与二进制转换,就使用了十六进制(2 4)和八进制(23).下面进入正题.

       数值有正负之分,计算机就用一个数的最高位存放符号(0为正,1为负).这就是机器数的原码了.假设机器能处理的位数为8.即字长为1Byte,原码能表示数值的范围为

(-127~-0 +0~127)共256个.

       有了数值的表示方法就可以对数进行算术运算.但是很快就发现用带符号位的原码进行乘除运算时结果正确,而在加减运算的时候就出现了问题:

( 1 ) 10- ( 1 )10 = ( 1 )10 + ( -1 )10 = ( 0 )10

(00000001)原 + (10000001)原 = (10000010)原 = ( -2 ) 显然不正确.

    因为在两个正整数的加法运算中是没有问题的,于是就发现问题出现在带符号位的负整数身上,于是引出了反码(对于正整数原码、反码是一样的,而负整数的反码是原码除最高位(符号位)外其余所有位的逐位求反。).反码的取值空间和原码相同且一一对应. 下面是反码的减法运算:

( 1 )10 - ( 1 ) 10= ( 1 ) 10+ ( -1 ) 10= ( 0 )10

(00000001) 反+ (11111110)反 = (11111111)反 = ( -127) 反= ( -0) 还有问题?!

( 1 )10 - ( 2)10 = ( 1 )10 + ( -2 )10 = ( -1 )10

(00000001) 反+ (11111101)反 = (11111110)反 = ( -126) 反 =( -1 ) 正确

问题出现在(+0)和(-0)上,在人们的计算概念中零是没有正负之分的.(印度人首先将零作为标记并放入运算之中,包含有零号的印度数学和十进制计数对人类文明的贡献极大).

于是又引入了补码(用最高位表示符号位,如果是0表示正数,如果是1表示负数,剩下的7位用来存数的绝对值的话,能表示128个数的绝对值,再考虑正负两种情况,128*2还是256个数。首先定义0在计算机中储存为00000000,对于正数我们依然可以像无符号数那样换算,从00000001到01111111依次表示1到127。那么这些数对应的二进制码就是这些数的原码(和原码一样)。到这里很多人就会想,那负数是不是从10000001到11111111依次表示-1到-127,那你发现没有,如果这样的话那么一共就只有255个数了,因为10000000的情况没有考虑在内。所以-1到-127不能那样表示(和原码的表示方法相同了,当然错了)。实际上,10000000在计算机中表示最小的负整数,即-128(原指-0的)。因为 -128+1=-127,那么把10000000加上1即10000001表示-127就容易计算很多了。这样,从10000001到11111111就刚好依次表示-127到-1。这就是所谓的补码。). 那么补码是怎样直接地转换得来呢?负数的补码就是对反码加一;而正数不变,正数的原码反码补码是一样的.在补码中用(-128)代替了(-0),所以补码的表示范围为:

(-128~0~127)共256个.

注意:当字长为8位时,(-128)没有相对应的原码和反码, (-128) = (10000000) (为什么?还有为什么8位整数表示的范围是-128~127,而不是-127~128呢?想过没有,为什么二进制10000000在原码和反码中表示0,在补码中它不表示0,保证了0表示的唯一性,但是它为什么表示负数,而不是正数,你也许会说,因为它符号位是1呀,表示负数呀,对,继续,+128我们用补码怎么表示,包括符号位,表示为010000000,超过了2个字节,如果截取低8位,那么是10000000,最高位(符号位)是1,表示的是一个负数了!我们再看看-128的机器码是多少,原码110000000,反码101111111,补码110000000,截取低8位即10000000,表示的是一个负数。)

补码的加减运算如下:

( 1 ) 10- ( 1 ) 10= ( 1 )10 + ( -1 )10 = ( 0 )10

(00000001)补 + (11111111)补 = (00000000)补 = ( 0 ) 正确

( 1 ) 10- ( 2) 10= ( 1 )10 + ( -2 )10 = ( -1 )10

(00000001) 补+ (11111110) 补= (11111111)补 = ( -1 ) 正确

所以补码的设计目的是:

⑴使符号位能与有效值部分一起参加运算,从而简化运算规则.

⑵使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计

所有这些转换都是在计算机的最底层进行的,而在我们使用的汇编、C等其他高级语言中使用的都是原码。看了上面这些大家应该对原码、反码、补码有了新的认识了吧!

浅谈 -128的原码 反码 补码相关推荐

  1. 关于计算机中 原码, 反码, 补码 详解

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

  2. 原码, 反码, 补码, 移码 详解

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

  3. 大端 小端 原码 反码 补码 及内存中的表现

    小端 和 大端 在内存中存储时,都是从内存的低地址往高地址存,即0x00000000 -> 0xffffffff 以汉字 "严"为例,Unicode码是4E25,需要两个字节 ...

  4. 原码 反码 补码 详解

    一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式,  叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放 ...

  5. python二进制反码例题_python中的进制转换和原码,反码,补码

    python中的进制转换和原码,反码,补码 计算机文件大小单位 b = bit 位(比特) B = Byte 字节 1Byte = 8 bit #一个字节等于8位 可以简写成 1B = 8b 1KB ...

  6. 原码 反码 补码 详解

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

  7. 进制之间的快速转换法:8421码及原码反码补码之间的相互转换关系

    进制之间的快速转换法: 十进制和二进制的指尖的快速转换法: 8421码,是BCD码的一种 二进制数据中的每个位上的1,都代表一个固定的数值,将固定的数值相加即可! 二进制: 1 1 1 1 1 1 1 ...

  8. 原码, 反码, 补码详解——北大陈向群老师课堂笔记

    一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放符 ...

  9. 原码,反码,补码,傻傻分不清?

    什么是原码,反码,补码? 非常重要!!! 计算机计算方式: 原码最左边的符号位,0为正数,1为负数; 将十进制转为二进制进行计算(原码),但是原码存在弊端,无法计算负数; 因此出现了反码用来计算负数, ...

最新文章

  1. 清空python的变量
  2. 十种经济的方法帮你建立企业品牌
  3. 一个平庸程序员的自白
  4. PHP学习笔记:php二手交易市场系统
  5. Google ARCore SDK
  6. java 中random类使用_Java中的天使和魔鬼:Unsafe类
  7. 程序员过关斩将--快速迁移10亿级数据
  8. 深入理解Java:注解(Annotation)
  9. [CodeForces-1138B] *Circus 解方程|数学
  10. 别人家的公司!Facebook向每位员工发放1000美元,鼓励远程办公
  11. 电商巨头Shopify 两名员工被指窃取客户交易详情
  12. pdf编辑工具linux,7个Ubuntu下的PDF编辑工具
  13. 高德地图初步使用-多点路线连接
  14. Makefile eval函数
  15. 做时间的朋友,必须知道收益咋算
  16. Profinet高速协议下,PLC之间如何实现无线以太网通讯?
  17. 交互媒体专题设计------《The Wiley Handbook of Human Computer Interaction》
  18. 苹果电脑mac os+win双系统在线安装回macos
  19. 全球IP地址短缺的危机 思科可同时支持IPv4和IPv6
  20. 简单CSS,实现“首字下沉”效果!

热门文章

  1. Unity游戏开发 怪物巡逻AI
  2. Java Generics
  3. 【Java】泛型(Generics)
  4. 组合数学(5)——拉丁方与H矩阵例题
  5. 驰骋工作流推出JAVA版本--JFlow
  6. IT专业报考指南:选择正确的学校和课程
  7. 五,浏览器兼容性问题及解决方法
  8. android帧动画倒放,GIF动态图怎么倒放_倒放GIF动态图的简单方法介绍_3DM手游
  9. Java笔记11-异常处理
  10. 国科大学习资料--模式识别与机器学习-2016期末考试题