1.前言

本人两年Java开发经验,开发期间干的大都是CRUD的活,温水煮青蛙。最近就想着投投简历,看下外面是个啥行情,抽空也背了些八股文。上周面了一家,虽然问的内容都很基础,就是面那种刚毕业的大学生才会问的问题,结果太紧张,脑子一片空白,背的一些题都忘光了,被面试官吊起来打。。。。。

痛定思痛,从现在开始记录每一个面试官问到的题(如果还记得的话),冲!

2.问题

面试官:给你个int类型的255,把它赋值到byte类型的变量上,然后打印这个变量,结果是多少?

我:255吧

面试官:byte的范围是多少?

我:我想想(2分钟过去了)。。。。

面试官:好吧,我再换一个问题吧。。。。。。

其实面试前我还特地记了下各个基本类型占几个字节,然而上面问题都没答出来。

3.解答

话不多说,直接上代码:

public class TestCase {public static void main(String[] args) {int a = 255;byte b;b = (byte)a;System.out.println(b);System.out.println(Integer.toBinaryString(a));System.out.println(Byte.MIN_VALUE);System.out.println(Byte.MAX_VALUE);}}

输出:

-1
11111111
-128
127

可以看到结果是 【-1】,但是这个结果是怎么来的呢?

3.1 技术准备

首先,回到一个比较基础的问题,java中byte的范围是多少?

从上面的打印结果中可以看到,byte类型的范围是[-128,127]。

那这个[-128~127]又是怎么来的呢?

这又涉及到java中的每种整数类型的占用的内存大小了。

java中byte类型的数占用1个字节。

一个字节=8位,一位就是一个0或1。

位又是啥概念?一位就是我们常说的1bit,1bit就是一个0或1,众所周知,计算机只认识0和1。

一位可以想象成一个小灯泡,灯泡亮了就是1,没亮就是0,一个字节就是8个小灯泡并排放在一起。

所以,一个byte类型的变量,大小为一个字节,就是用8位(8个小灯泡)来表示的。

那么这8位又是什么意思?怎么用8位来表示一个数?

首先要了解二进制的数怎么转化成十进制的数的,网上随便百度下都能找到,此处不再描述。

而java中,乃至计算机中实际上是如何用二进制来描述一个数的呢?

我们都是站在巨人的肩膀上的,怎么用8位表示一个数,几十年前的计算机先驱们都安排好了。答案是用了一个叫做【补码】的东西。补码又是啥??

不好解释,直接上链接:

原码,反码,补码的深入理解与原理_小小云麓的博客-CSDN博客_原码反码补码

3.2 开始计算

恶补了上面的内容后,首先就可以弄明白为什么byte的范围是[-128,127]了,然后终于可以开始研究为什么int的255转成byte后就变成了-1。

java中int是4个字节,就是4组小灯泡,每组8个灯泡。

int类型的255用二进制来表示(上面的演示程序中也打印出来的了,只是因为高位都是0所以就只打印了后面8个1)如下所示(左面为高位):

00000000 00000000 00000000 11111111

而byte只有1个字节,只能用1排小灯泡,int有4排,装不下,咋办呢?

所以就抛弃了高位的3个字节,把低位的那一排用来表示byte,如下图:

11111111

好了,现在只要我们把这8个1,翻译成人能方便地转化成熟悉的十进制数就行了。

翻译过程就是一个根据【补码】求【原码】的过程,如下:

首先要知道这是一个【补码】,先看第一位(符号位),第一位是 1,表示这是一个负数。

然后,既然是个负数,先不管第一位的1

先反转(即0变1,1变0)后面7位,则后面7位反转后变成 7个0 :0000000

然后将反转后的二进制数+1,就变成了6个0加一个1:0000001

所以加上之前的第一位的1,求得的原码就是【10000001】

即【-1】。

3.3 再次验证

好了,现在在随便找一个数,手工算一下,就找int类型的278吧

int类型的278的二进制补码表示:

public class TestCase {public static void main(String[] args) {int a = 278;byte b;b = (byte)a;
//        System.out.println(b);System.out.println(Integer.toBinaryString(a));}}输出:
100010110即:
00000000 00000000 00000001 00010110

看后面8位:

00010110

首位是0,欸,是个正数,整数的【补码】和【原码】相同,那应该就是2 + 4 + 16 = 22

验证一下:

public class TestCase {public static void main(String[] args) {int a = 278;byte b;b = (byte)a;System.out.println(b);System.out.println(Integer.toBinaryString(a));}
}输出:
22
100010110

果然,22,计算正确!

好,趁热打铁,再来一个,计算int类型的128,赋值给byte类型。

public class TestCase {public static void main(String[] args) {int a = 128;System.out.println(Integer.toBinaryString(a));byte b;b = (byte)a;System.out.println(b);}
}输出:
10000000
-128

首先看下int的二进制表示:

00000000 00000000 00000000 10000000

转化成byte的二进制:

10000000

欸,先看首位,是个1,是个负数,

反转后面7个0,变成7个1,7个1在加1,就变成了一个1跟7个0:

1111111 + 0000001 = 10000000

在结合首位的1,得到的原码就是:

110000000

即-1 乘 2的7次方 = -128

好,再来一个负数的int,计算int类型的-130,赋值给byte类型。

public class TestCase {public static void main(String[] args) {int a = -130;System.out.println(Integer.toBinaryString(a));byte b;b = (byte)a;System.out.println(b);}
}
输出:
11111111111111111111111101111110
126

int的二进制:

11111111 11111111 11111111 01111110

byte的二进制:

01111110

首先,首位是个0,是个正数,也不用取反了,直接按位加就完了,2+4+8+16+32+64 =  126

所以就是126

4.简单求法

讲道理,手工从二进制算十进制还好。从十进制手工算二进制,你是在刁难我胖虎!

其实,byte的范围之内部分,int与之都是对应的,一旦int的值超过了byte的范围,那么就从byte的另一个边界开始轮回就可以了:

128是第一个超过byte最大值的数,那么就从byte的最小值开始数,即int的128转化为byte后就是-128,

同理int的129转成byte就是-127,后面依次类推。

往下数也是同样的道理,int的-128化为byte后就是-128,而int的-129化为byte后就是127。

所以这种大范围向小范围的数字兼容的,其实是有规律的,就拿int和byte来说,后8位总是一个循环的:

比如int的0:

int :00000000 00000000 00000000 00000000
byte:                           00000000

比如int的1:

int :00000000 00000000 00000000 00000001
byte:                           00000001

...

比如int的127:

int :00000000 00000000 00000000 01111111
byte:                           01111111

比如int的128:

int :00000000 00000000 00000000 10000000
byte:                           10000000  // -128

比如int的255:

int :00000000 00000000 00000000 11111111
byte:                           11111111 // -1

比如int的256:

int :00000000 00000000 00000001 00000000
byte:                           00000000  // 0

[java] int转byte的细节相关推荐

  1. java int转byte数组_javaint转byte数组

    JAVA中怎么将int数据转换为byte数据? 例如将int b=325转换为 byte a,结果为多少啊? JAVA中根据以下代码将int数据转换为byte数据: public static byt ...

  2. java int byte数组_Java 中int与byte数组转换详解

    1.与运算符的理解(&): 参加运算的两个数据,按二进位进行"与"运算.如果两个相应的二进位都为1,则该位的结果值为1,否则为0.即 0&0=0:0&1=0 ...

  3. C的无符号数据类型int,short,byte 转为 Java对应的数据long,char,short

    //从网络中读取C的无符号int,short,byte字节数组,相应转换成java的long,char,short short anUnsignedByte = 0; char anUnsignedS ...

  4. java编程int和byte的用法_Java中的Byte Array和Int转换

    Java中的Byte Array和Int转换 我有这两个函数有一些困难: byteArrayToInt和intToByteArray . 问题是,如果我使用另一个来得到另一个结果,结果是不同的,你可以 ...

  5. Java中Int转byte分析

    针对声明变量 int i = 3,j = 8; int占4个字节,i = 3 在Java二进制表示: 00000000 00000000 00000000 00000011 j = 8 在Java二进 ...

  6. Java中的byte[]/char[]/int/String数据类型转换

    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/51743969 文章出自:薛瑄的博客 你也可以查看我的其他同类文章,也会让你有一定的 ...

  7. byte类型转换细节分析:Type mismatch: cannot convert from int to byte?出现这个报错的解决方案

    面对这种问题,大家应该都有这样的疑惑,我全部都是byte类型的数据,而且两个相加也并没超过byte类型的表示范围,但是为什么会报错Type mismatch: cannot convert from ...

  8. Java语言Int与byte[]互转详解分析

    我先贴出最终转换的代码,再来进行一步一步的介绍: /*** 将int数值转换为占四个字节的byte数组** @param value 要转换的int值* @return byte数组*/ public ...

  9. Java初认识--基本数据类型(int 和byte之间赋值)默认值 类型强转

    Java简单介绍 Java面向对象:一个面向对象的木匠关心的制作的椅子:这个木匠干了什么事情 非面向对象的木匠关心的是所使用的工具. 狗吃粮 面向对象 吃狗粮 非面向对象 Java与c++区别: 1. ...

最新文章

  1. NTU 课程笔记 :NLP - language model
  2. Q_learning简介与实例
  3. SQL存储过程的导入导出
  4. java 1%10_Java获取随机数的3种方法
  5. 洛谷入门题P1046、P1047、P1427、P1428、P2141、P1567题解(Java语言描述)
  6. 一个通用的单元测试框架的思考和设计02-设计篇
  7. java爬虫框架_Python,爬虫开发的不二选择
  8. 最简单DIY基于Android系统的万能蓝牙设备智能遥控器
  9. caffe安装+Ubuntu16.04+三显卡gpu加速
  10. 【转】十分钟了结MySQL information_schema
  11. 关于处理Excel表中文字不能自动换行问题
  12. WPA3 vs WPA2
  13. 读计算机带笔记本还是台式,选台式机还是选笔记本?这里有点心得告诉你
  14. 蒲丰投针计算机模拟ppt,蒲丰投针实验模课件.doc
  15. 业余LaTeX学习笔记(一)-引言
  16. 恶意.NET安全攻防(一):使用ETW隐藏你的.NET
  17. Proteus使用教程详细入门版(适用于 MCS-51等)
  18. 每日一BUG(javax.el.PropertyNotFoundException: 类型[com.Bean.Goods]上找不到属性[img])
  19. python照片转手绘_python中如何将照片手绘化?
  20. 数字电子技术实验作业(1)西科大

热门文章

  1. w ndows只能安装到gpt磁盘,在EFI系统上Windows只能安装到GPT磁盘的解决方法
  2. COOX培训材料 — SCADA(4.Agitator)
  3. 30岁程序员的转型思考
  4. 群体遗传学-选择清除分析基本概念及参数
  5. linux中c语言开发实验报告,Linux下C语言编程实验报告.doc
  6. msysgit使用注意
  7. 【经验】UltralSO制作启动盘时报错:磁盘/映像容量太小
  8. 计算机教师的名言是,教师的名言
  9. gSOAP编译以及测试过程
  10. 计算机丢失logmanager dll,修复logmanager.dll