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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 汪洋大海 中级黑马   /  2013-12-29 01:30  /  1618 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Demo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int a = 255;
  6.                 System.out.println((int)(byte)a);
  7.         }
  8. }
复制代码
打印的结果为什么会是-1?

评分

参与人数 1黑马币 +3 收起 理由
乔兵 + 3

查看全部评分

4 个回复

倒序浏览
本帖最后由 DOOR 于 2013-12-29 02:01 编辑

int型是32位
byte型是8位的

int a=255;
a的存储是这样的:00000000 00000000 00000000 11111111
强转成byte需要强制截去前面多余的24位,
所以 (byte)a的存储是这样的:11111111
对应的值就是-1
然后再强转成int32位,前面补0还是1需要根据被转化的最高位来进行补位也就是这里的1
那么(int)(byte)a的存储是这样的:11111111 11111111 11111111 11111111
所以最终还是-1

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报 1 1
System.out.println((int)(byte)a); 其实就是这样的   System.out.println((byte)a); 你那个在装进int里 能撑下
byte 是-128到127  下一个循环是256个值  256-127=129 对应-128--127  掐指一算就是-1呀
回复 使用道具 举报
说byte占一个字节没错,但是一般人都只知其一不知其二,1byte等于8bit(位)如果这8位都用于表示整数那能表示0-255的任意数,但是byte类型即可以表示正整数也可以表示负整数,所以第1位是符号位(用于表示正数还是负数)剩下7位用于表示整数,因此只能表示-128-127,255是一个字面量(就是直接写的一个整数)默认类型是int,现在要将一个int类型(4个字节,也就是32位)强制转换为byte类型(1个字节,也就是8位)肯定要丢失一些精度,因为int大,byte小,只能将int数的后8位保留下来,赋值给byte类型的变量

255的二进制是00000000000000000000000011111111,截取成byte类型只保留后
8位,也就是11111111,第1位是符号位0代表正数、1代表负数,这里第一位是1也就是负数,计算机存储的负数是补码,必须将其他位取反(变成全零)再加1,取反加1后这个数为-00000001,这个二进制数转换为整数是-1。所以结果为-1

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
哥们这种形式的代码是怎么从编辑器粘过来的?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马