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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨康 中级黑马   /  2012-7-11 20:11  /  14630 人查看  /  8 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨康 于 2012-7-12 17:23 编辑

在看进制转换视频的时候,比老师说一个byte占8个二进制位,而byte的取值范围却是-128~127
而127的二进制表现形式为1111111,而127只占用了7位,为什么8个1也就是255不能放在byte的取值范围内呢?


看了大家的回复,心里总算搞明白这个小问题了,谢谢大家的帮助。

byte.jpg (13.44 KB, 下载次数: 377)

byte.jpg

评分

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

查看全部评分

8 个回复

倒序浏览
最高位 符号位
回复 使用道具 举报
1 byte = 1字节 = 8bit 可表达 2的八次方个数字
当取无符号的时候,所有位数可以全为0或者1,切没有符号位。当取有符号位时,取首位为符号位,0表示正数,1表示负数。所以
short 取值范围 -128------127
回复 使用道具 举报
本帖最后由 王双宝 于 2012-7-11 20:48 编辑

计算机数据是用补码表示的,正数的补码就是它的原码,而负数的补码是将其原码取反加1得到的。
当二进制表示为11111111,它是一个负数,将其取反加1得到原码10000001,对应十进制数为-1.因此8位二进制正数最大为01111111(127),8位二进制负数最小为10000000(-128)
回复 使用道具 举报
8个1是在byte范围内的,只不过表示的是-1
-128 ---- 10000000
127  ---- 01111111
计算机中的数字是使用补码表示的
补码的最高位为0,表示是正数,最高位是1,表示是负数
二进制补码转十进制:
若最高位是0,正数,按照正常二进制转十进制计算,
若最高位是1,负数,首先全部取反,然后末位加1,再按照正常的算法计算,得到的数字前面加负号即可

十进制转二进制补码:
正数,直接计算,除2取余,得出来的二进制不够位时,前面补0
负数,首先求其绝对值的二进制,然后再将此二进制数字取反加1即可

对于byte型,如果全是1,表示是负数
11111111  --》取反 --》00000000  --》加1 --》00000001 --》1,前面加负号 --》-1

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
在csdn论坛上的这个图很好的说明了这个问题:
0 00000000
1 00000001
…….
127 01111111
----------------
共 128 个

-1 11111111
-2 11111110
……
-128 10000000

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

共 128

我们都知道byte占8位。而2的8次方等于256,也就是byte最多可以表示256个不同的数,
0~127:128个
-0~127:128个
但是这里0与-0表示一样的数了,所以就用-0的二进制补码表示到-128里面去了
回复 使用道具 举报
陈冲 中级黑马 2012-7-11 22:32:19
7#
本帖最后由 陈冲 于 2012-7-11 22:42 编辑

负数的补码是该数绝对值的原码按位取反,然后 整个数加1
Java使用补码来表示二进制数,在补码表示中 ,最高位为符号位,正数的符号位为0,负数为1
对负数而言,把该数绝对值的补码按位取反,然后对整个数加1,即得该数的补码。 如-42的补码为11010110 (00101010 按位取反 11010101 +1=11010110 )

1.确定byte是1个字节,也就是8位

2.最大的应该是0111 1111,因为第一位是符号位,0表示正数

3.最小的应该是1000 0000,同理,表示负数最小的(1111 1111是最大的负数-1)

4.0111 1111即127

5.1000 0000按照上面的解释为先减一,得到0111 1111,然后按位取反得到1000 0000,该结果为欲求负数的绝对值,所以结果是-128(和概念反着来求出该负数)

简单来说byte类型的取值范围
用补码表示为
1000 0000~0111 1111
用原码表示为
-1000 0000~0111 1111(-128~127)

评分

参与人数 1技术分 +1 收起 理由
黑马张扬 + 1

查看全部评分

回复 使用道具 举报 1 0
因为在java中,int类型是有符号的,所以需要有一位表示符号位,而最高位就是用来表示符号位的,
最高位是0表示一个正数
最高位是1表示一个负数
回复 使用道具 举报
陈冲 发表于 2012-7-11 22:32
负数的补码是该数绝对值的原码按位取反,然后 整个数加1
Java使用补码来表示二进制数,在补码表示中 ,最高位 ...

原码    1000 0000
取反    1111 1111
加一 1 0000 0000
相当于多出一个bits
如果位运算符不参与加一,则补码
是     1 1000 0000
这个是什么机制
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马