黑马程序员技术交流社区

标题: 数据类型取值范围的疑惑 [打印本页]

作者: 范晓冲    时间: 2013-12-31 12:47
标题: 数据类型取值范围的疑惑
本帖最后由 范晓冲 于 2013-12-31 21:42 编辑

为什么byte类型的数据的取值范围是-128~127?
八个二进制位最大值不就是127吗?
那byte的取值范围不应该是-127~127吗?
为什么还有一个-128?
作者: rainforestking    时间: 2013-12-31 12:57
本帖最后由 rainforestking 于 2013-12-31 12:58 编辑

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

七个二进制位最大值是127吧?
二进制数1111111不是127吗?
七个二进制位怎么就可以表示128呢?
作者: rainforestking    时间: 2013-12-31 15:15
范晓冲 发表于 2013-12-31 14:44
七个二进制位最大值是127吧?
二进制数1111111不是127吗?
七个二进制位怎么就可以表示128呢? ...

正数的确是从0-127,但是负数不是直接表示的,是用补码,具体什么是补码百度上有很多解释,自行查阅,现在计算机都快当成文科学了,很多程序员对计算机的体系结构都没有了解,像楼主这样刨根问底的人不多了啊!
作者: 天天学习    时间: 2013-12-31 18:05
本帖最后由 天天学习 于 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之间。
作者: 范晓冲    时间: 2013-12-31 18:16
天天学习 发表于 2013-12-31 18:05
1, 在二进制中,正数的最高为为0,负数的最高位为12, Java中负数采用正数的补码来表示,即对正数取反后加 ...

二进制数10000001对应的十进制数是129吧??
作者: 范晓冲    时间: 2013-12-31 18:18
rainforestking 发表于 2013-12-31 12:57
恩~~~八个二进制位最大值是256啊!去掉最高位的符号位,就是七位,能表示128个绝对值,也就是把256平分到正 ...

补码?好的,谢谢,我去看看
作者: jibenwujie    时间: 2013-12-31 18:31
按照补码的定义,一个负数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
作者: 天天学习    时间: 2013-12-31 18:45
一个数如果为正,则它的原码、反码、补码相同;一个数如果为负它的补码为符号位为1,其余各位是对原码取反,然后整个数加1。
作者: 天天学习    时间: 2013-12-31 19:37
范晓冲 发表于 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 21:38
天天学习 发表于 2013-12-31 19:37
1,原码:将最高位作为符号位(以0代表正,1代表负),其余各位代表数值本身的绝对值(以二进制表示)。
...

好的,明白了,谢谢,非常感谢,辛苦了 :)
作者: 范晓冲    时间: 2013-12-31 21:40
天天学习 发表于 2013-12-31 18:45
一个数如果为正,则它的原码、反码、补码相同;一个数如果为负它的补码为符号位为1,其余各位是对原码取反 ...

恩恩,知道了,谢谢!
作者: 范晓冲    时间: 2013-12-31 21:41
jibenwujie 发表于 2013-12-31 18:31
按照补码的定义,一个负数M的补码,其二进制表示等同于无符号整数2 ^ N + M,其中N是这种类型的位数。
对于 ...

明白了,谢谢哈
作者: 浮出一个美    时间: 2013-12-31 23:58
从前有个印度神人,发现-128`0  0~127这不是有两个0吗,肿么办呢,拿一个0去充当-128,就是这么回事。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2