A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 范晓冲 中级黑马   /  2013-12-31 12:47  /  1838 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 范晓冲 于 2013-12-31 21:42 编辑

为什么byte类型的数据的取值范围是-128~127?
八个二进制位最大值不就是127吗?
那byte的取值范围不应该是-127~127吗?
为什么还有一个-128?

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!

查看全部评分

13 个回复

倒序浏览
本帖最后由 rainforestking 于 2013-12-31 12:58 编辑

恩~~~八个二进制位最大值是256啊!去掉最高位的符号位,就是七位,能表示128个绝对值,也就是把256平分到正负两部分,正:0—127(共128个),负:-128— -1(共128个),不知道说清楚了没?哎,混技术分不容易啊!
回复 使用道具 举报
rainforestking 发表于 2013-12-31 12:57
恩~~~八个二进制位最大值是256啊!去掉最高位的符号位,就是七位,能表示128个绝对值,也就是把256平分到正 ...

七个二进制位最大值是127吧?
二进制数1111111不是127吗?
七个二进制位怎么就可以表示128呢?
回复 使用道具 举报
范晓冲 发表于 2013-12-31 14:44
七个二进制位最大值是127吧?
二进制数1111111不是127吗?
七个二进制位怎么就可以表示128呢? ...

正数的确是从0-127,但是负数不是直接表示的,是用补码,具体什么是补码百度上有很多解释,自行查阅,现在计算机都快当成文科学了,很多程序员对计算机的体系结构都没有了解,像楼主这样刨根问底的人不多了啊!

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!新年快乐同学~

查看全部评分

回复 使用道具 举报
本帖最后由 天天学习 于 2013-12-31 19:36 编辑


1,原码:将最高位作为符号位(以0代表正,1代表负),其余各位代表数值本身的绝对值(以二进制表示)。
2,反码:一个数如果为正,则它的反码与原码相同;一个数如果为负,则符号位为1,其余各位是对原码取反。
3,补码:一个数如果为正,则它的原码、反码、补码相同;一个数如果为负,则符号位为1,其余各位是对原码取反,然后整个数加1
4,计算机采用补码的形式表示数据
       4.1原码:由于+0的表现形式为00000000-0的表现形式为10000000那么它的表示形式不唯一,因此计算机并未采用原码的形式表示数据
       4.2反码:由于+0的反码为00000000,而-0的反码为11111111因此0的表现形式也不唯一,所以计算机也没有采用反码的形式表示数据
       4.3因此在计算机中采用的是补码表示数据的。
5,一个字节(byte)占8位,如果表示一个正数那么它的最高位为0,因此还剩下7位,若想取得最大的正数,那么剩下的7位均为1,即一个字节所能表示的最大正数为01111111,将其转成十进制的数为127,转换过程为:01111111=0*27+1*26+1*25+1*24+1*23+1*22+1*21+1*20=127
6,一个字节所能表示的最小负数为最高位为1,要想表示的数最小那么其余位为010000000其实这个是个补码要把它转换成十进制应分三步
       6.1,先对各位取反,即10000000取反后为01111111
       6.2,将取反后的结果转换为十进制数即为127
       6.3,加上负号,再减去1-127-1=-128
因此一个字节所能表示的数据在-128127之间。

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!新年快乐同学~

查看全部评分

回复 使用道具 举报
天天学习 发表于 2013-12-31 18:05
1, 在二进制中,正数的最高为为0,负数的最高位为12, Java中负数采用正数的补码来表示,即对正数取反后加 ...

二进制数10000001对应的十进制数是129吧??
回复 使用道具 举报
rainforestking 发表于 2013-12-31 12:57
恩~~~八个二进制位最大值是256啊!去掉最高位的符号位,就是七位,能表示128个绝对值,也就是把256平分到正 ...

补码?好的,谢谢,我去看看
回复 使用道具 举报
按照补码的定义,一个负数M的补码,其二进制表示等同于无符号整数2 ^ N + M,其中N是这种类型的位数。
对于byte的-128而言,N为8,M为-128,2 ^ 8 + (-128) = 128,而无符号数的128正好是:10000000。
从这个角度来数,当无符号数的0~255表示带符号数时,基中0~127仍表示原值,而128~255则表示-128~-1,补码表示中不像原码那样还有个-0

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!新年快乐同学~

查看全部评分

回复 使用道具 举报
一个数如果为正,则它的原码、反码、补码相同;一个数如果为负它的补码为符号位为1,其余各位是对原码取反,然后整个数加1。
回复 使用道具 举报
范晓冲 发表于 2013-12-31 18:16
二进制数10000001对应的十进制数是129吧??

1,原码:将最高位作为符号位(以0代表正,1代表负),其余各位代表数值本身的绝对值(以二进制表示)。

2,反码:一个数如果为正,则它的反码与原码相同;一个数如果为负,则符号位为1,其余各位是对原码取反。

3,补码:一个数如果为正,则它的原码、反码、补码相同;一个数如果为负,则符号位为1,其余各位是对原码取反,然后整个数加1。

4,计算机采用补码的形式表示数据

       4.1原码:由于+0的表现形式为00000000而-0的表现形式为10000000那么它的表示形式不唯一,因此计算机并未采用原码的形式表示数据

       4.2反码:由于+0的反码为00000000,而-0的反码为11111111因此0的表现形式也不唯一,所以计算机也没有采用反码的形式表示数据

       4.3因此在计算机中采用的是补码表示数据的。

5,一个字节(byte)占8位,如果表示一个正数那么它的最高位为0,因此还剩下7位,若想取得最大的正数,那么剩下的7位均为1,即一个字节所能表示的最大正数为01111111,将其转成十进制的数为127,转换过程为:01111111=0*27+1*26+1*25+1*24+1*23+1*22+1*21+1*20=127

6,一个字节所能表示的最小负数为最高位为1,要想表示的数最小那么其余位为0即10000000其实这个是个补码要把它转换成十进制应分三步

       6.1,先对各位取反,即10000000取反后为01111111

       6.2,将取反后的结果转换为十进制数即为127

       6.3,加上负号,再减去1即-127-1=-128
因此一个字节所能表示的数据在-128到127之间。
回复 使用道具 举报
天天学习 发表于 2013-12-31 19:37
1,原码:将最高位作为符号位(以0代表正,1代表负),其余各位代表数值本身的绝对值(以二进制表示)。
...

好的,明白了,谢谢,非常感谢,辛苦了 :)
回复 使用道具 举报
天天学习 发表于 2013-12-31 18:45
一个数如果为正,则它的原码、反码、补码相同;一个数如果为负它的补码为符号位为1,其余各位是对原码取反 ...

恩恩,知道了,谢谢!
回复 使用道具 举报
jibenwujie 发表于 2013-12-31 18:31
按照补码的定义,一个负数M的补码,其二进制表示等同于无符号整数2 ^ N + M,其中N是这种类型的位数。
对于 ...

明白了,谢谢哈
回复 使用道具 举报
从前有个印度神人,发现-128`0  0~127这不是有两个0吗,肿么办呢,拿一个0去充当-128,就是这么回事。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马