黑马程序员技术交流社区

标题: 关于java数据类型的取值范围 [打印本页]

作者: GSF@    时间: 2014-12-16 22:34
标题: 关于java数据类型的取值范围
本帖最后由 GSF@ 于 2014-12-16 22:36 编辑

视频中讲到java数据类型的取值范围我就不太清楚了,一个byte是8位,
比如二进制                   0                  1                    0                  1                  0                    1                    0                      1
对应十进制             2的7次方  +  2的6次方  +  2的5次方  +  2的4次方  +  2的3次方  +  2的2次方  +   2的1次方    +   2的0次方  

                                  128       +      64         +       32        +      16       +       8          +        4         +       2            +         1


老师说byte的范围是                  127   ~  -128
但是我有疑问,  1.为啥不是      128   ~   -128?  
                         2.既然范围值得是   最大~最小  为什么最大范围不是11111111对应的 255?
比如二进制                   1                  1                    1                  1                  1                    1                    1                      1
对应十进制             2的7次方  +  2的6次方  +  2的5次方  +  2的4次方  +  2的3次方  +  2的2次方  +   2的1次方    +   2的0次方  

                                  128       +      64         +       32        +      16       +       8          +        4         +       2            +         1

感觉概念有点乱。





作者: 陈均林    时间: 2014-12-16 22:43
这个进制我也没有搞明白是怎么回事。
作者: GSF@    时间: 2014-12-16 22:45
陈均林 发表于 2014-12-16 22:43
这个进制我也没有搞明白是怎么回事。

那一起坐等答案吧
作者: czwanglei    时间: 2014-12-16 23:11
简单解释下,数都是由二进制组成的,这是八位的数字。八个1也就是0111 1111 最高为0表示正数。后面的111 1111转换为十进制就是127了。这是计算机基础里面的东西。
作者: GSF@    时间: 2014-12-16 23:38
czwanglei 发表于 2014-12-16 23:11
简单解释下,数都是由二进制组成的,这是八位的数字。八个1也就是0111 1111 最高为0表示正数。后面的111 11 ...

最小范围,也就是1111 1111 , 十进制为127,
0111 111 和 1111 1111 的第一个“1”或“0”只代表符号,不参与运算,并也正数只能是“0”,负数只能是“1”,是这样?
作者: czwanglei    时间: 2014-12-16 23:42
GSF@ 发表于 2014-12-16 23:38
最小范围,也就是1111 1111 , 十进制为127,
0111 111 和 1111 1111 的第一个“1”或“0”只代表符号, ...

后面的对,前面的不对。最小范围,也就是1111 1111 , 十进制为-128,怎么算的。  去网上搜搜自己自学下。。
作者: 青衫禅客    时间: 2014-12-17 00:28
当初的设计者就是这样设计的,就像自然规律就这样,这就是规则
作者: GSF@    时间: 2014-12-17 00:37
青衫禅客 发表于 2014-12-17 00:28
当初的设计者就是这样设计的,就像自然规律就这样,这就是规则

应该是能说通的,我只是理解的不够透彻
作者: 青衫禅客    时间: 2014-12-17 00:52
GSF@ 发表于 2014-12-17 00:37
应该是能说通的,我只是理解的不够透彻

把它认定为规定就行了。
作者: 秦守志    时间: 2014-12-17 09:10
补码表示的数,是没有正负0的,因此除了最高位的符号位以外,可以表示的数最大为 127,因此最大为 +127  ,又因为 10000000,并不是表示为  -0   因此用 1000000表示 -128,《计算机结构原理》里有,我是计算机专业的,有学过
作者: ql627666537    时间: 2014-12-17 09:11
老师经常说不要问我什么,记住,运用就行。这是创造它的时候规定的。
作者: GSF@    时间: 2014-12-17 11:14
ql627666537 发表于 2014-12-17 09:11
老师经常说不要问我什么,记住,运用就行。这是创造它的时候规定的。

也是哦,我太咬文嚼字了,谢谢
作者: GSF@    时间: 2014-12-17 11:15
czwanglei 发表于 2014-12-16 23:42
后面的对,前面的不对。最小范围,也就是1111 1111 , 十进制为-128,怎么算的。  去网上搜搜自己自学下 ...

嗯嗯,我马上去查,谢谢了
作者: ↘宀˙亲哚/    时间: 2014-12-17 13:37
最高位是符号位呀,还外加一个0这个特殊的元素
作者: Little_Pea    时间: 2014-12-17 15:45
楼主没有搞清楚一件事:负数的二进制表示。
byte i = 1;  // i =  00000001
byte j = -1; // j = 11111111
-1怎么表示的呢?负数是正数二进制的反码加1,那什么是反码呢?反码就是把正数的每一位二进制取反。
正数 1 =  00000001;
1的反码为:11111110;
反码加1就是-1 = 11111111;

所以00000000~011111111表示正数的0~127;
10000000~11111111表示负数的-128~-1。



作者: GSF@    时间: 2014-12-17 16:38
Little_Pea 发表于 2014-12-17 15:45
楼主没有搞清楚一件事:负数的二进制表示。
byte i = 1;  // i =  00000001
byte j = -1; // j = 11111111

谢谢啊,你说的很清楚。负数的二进制表示我弄清楚了。
负数前面是0,正数前面是1,能改变?如过不能改变, +128 不就是1000 0000
作者: Little_Pea    时间: 2014-12-17 17:13
GSF@ 发表于 2014-12-17 16:38
谢谢啊,你说的很清楚。负数的二进制表示我弄清楚了。
负数前面是0,正数前面是1,能改变?如过不能改变 ...

不能改变,最高位是符号位,这是规定好的。byte不能表示128,超出范围了。10000000只能是-128。
作者: 王晓杰    时间: 2014-12-17 22:26
有的东西没必要深究  研究可以 只能做个延伸 一个问题不要过于去深究
作者: 嗷嗷嗷    时间: 2014-12-17 22:38
没啥意识啊
作者: GSF@    时间: 2014-12-17 23:40
王晓杰 发表于 2014-12-17 22:26
有的东西没必要深究  研究可以 只能做个延伸 一个问题不要过于去深究

ENEN ,很赞成你的话
作者: 中国梦    时间: 2014-12-23 10:46
做个沙发
作者: GSF@    时间: 2014-12-23 22:55
中国梦 发表于 2014-12-23 10:46
做个沙发

:P:P:P:P:P:P:P:P:P:P:P:P:P:P:P:P
作者: 中国梦    时间: 2014-12-24 09:02
做个沙发
作者: lixing123456    时间: 2014-12-24 09:14
我们老师也说,记住就可以了。




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