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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 严磊 黑马帝   /  2011-8-29 13:27  /  2554 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

byte a = (byte)129;
System.out.print(a);  
       a为什么会是-127 ??

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1 给个鼓励!呵呵……

查看全部评分

9 个回复

倒序浏览
黑马网友  发表于 2011-8-29 13:39:47
沙发
1. int类型一般是4个字节,一个字节有8位,这样int型数据二进制的完整形式有32位,而byte表示一个字节,于是byte类型数据二进制的完整形式有8位。
2. 二进制数据在计算机内是以二进制存储的,要注意一点,计算机在存储某个数据时,是存储的数据的补码,说明一下补码与原码关系,正数补码与原码相同,负数补码是原码减1后取反。
3. 根据上面阐述,129的原码是00000000 00000000 00000000 10000001 ,负数最高位取1,那么-129便是10000000 00000000 00000000 10000001 ,补码计算:减1为10000000 00000000 00000000 10000000 ,再取反为11111111 11111111 11111111 01111111(最高位是符号位,不参与取反),现在转换为byte,只有8位,于是只能保留低8位,前面24位丢去,得到01111111,这就对应着十进制的127.

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2 回答的很好!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-8-29 13:44:07
藤椅
mod,取模。
回复 使用道具 举报
黑马网友  发表于 2011-8-29 19:01:41
板凳

回复 楼主 的帖子

孙宇回答的不错,我想说的就是,byte类型他的值取值范围为1个字节,八位,是-128到127,你129超过了127自然就发生了溢出,然后就变成-127了……我回答的好像有点乱
回复 使用道具 举报
黑马网友  发表于 2011-8-29 19:45:15
报纸
sunyu的回答已经无懈可击了……受教了~
回复 使用道具 举报
黑马网友  发表于 2011-8-29 20:53:59
地板
简单理解.,就像double强制转换为int ,不准了.
回复 使用道具 举报
黑马网友  发表于 2011-8-29 22:44:56
7#
在计算机内,定点数有3种表示法:原码、反码和补码

所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。

反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1

计算存储的是补码
129的原码int(00000000 00000000 00000000 10000001)正数反码、补码相同
强制转成byte 留下最低8位10000001(一个负数的补码形式)
负数的补码=原码取反+1
》》》》
原码=(负数补码-1)取反
?=(10000001-1)取反=(10000000)取反=11111111=-127           注意取反的时候符号位不变

原码减1后取反=原码取反+1

绕得头疼,这一次搞定以后再不看了

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2 回答的很好!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-8-29 23:18:43
8#

回复 沙发 的帖子

3Q      :loveliness:
回复 使用道具 举报
黑马网友  发表于 2011-8-29 23:57:37
9#

回复 7 # 的帖子

3Q :loveliness:
回复 使用道具 举报
黑马网友  发表于 2011-8-30 10:11:00
10#
2L 强人
计算机组成原理 补码反码原码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马