java成长笔记

数据类型和Max+1

2019-07-23  本文已影响0人  G_uest

java基本数据类型

整数类型

类型 字节 bit 范围 备注
byte 1字节 8bit -128~127 -
short 2字节 16bit -32768~32767 -
int 4字节 32bit -2147483648~2147483647 默认
long 8字节 64bit -9223372036854775808~9223372036854775807 -

浮点类型

类型 字节 备注
float 4字节 -
double 8字节 默认

字符类型

类型 字节
char 2字节

布尔类型

类型 字节
boolean 不确定 false/true

jvm中没有任何供boolean值专用的字节码指令
boolean值,在编译之后都使用Java虚拟机中的int数据类型 ------ 4字节
boolean数组将会被编码成Java虚拟机的byte数组 ------ 1字节
原因:
  对于当下32位的CPU,一次处理数据是32位(这里是指的是指CPU硬件层面,不是操作系统),具有高效存取的特点。


自动类型转换

char byte short --> int --> long --> float --> double

char a = 'a';
int i = a;  // i = 97

char b = 98;    // b = 'b'  不存在类型转换,查表得到b的值

//String 不是基本数据类型
String str = 1 + 2 + "1+2=" + 1 + 2;    // str = 31+2=12

强制类型转换

int i = 123;
byte b = (byte)i;

double d = 12.3;
float f = (float)d;

赋值

赋值从右往左进行,会把右边的常量当做默认类型,赋值给左边变量

//这样写会报错
//数值太大,超出int范围
long l = 123456789012
//double类型赋值给float类型,损失精度
float f = 1.23

//正确写法
long l = 123456789012L
float f = 1.23f

// int 与 long运算,自动转换为long类型
long n = 2147483647 + 1L;
System.out.println(n);      // print  2147483648

// java中数字默认是 int 类型,运算结果为int类型 然后复制给long
n = 2147483647 + 1;
System.out.println(n);      // print  -2147483648

数值运算 max + 1 = min

代码:

long l = 9223372036854775807L + 1;
System.out.println("long_Max + 1 = " + l);

int i = 2147483647 + 1;
System.out.println("int_Max + 1 = " + i);

short s = (short) (32767 + 1);
System.out.println("short_Max + 1 = " + s);

byte b = (byte) (127 + 1);
System.out.println("byte_Max + 1 = " + b);

结果:

long_Max + 1 = -9223372036854775808
int_Max + 1 = -2147483648
short_Max + 1 = -32768
byte_Max + 1 = -128

原因:

以 int 类型数据运算为例
   0111 1111 1111 1111 1111 1111 1111 1111
+   0000 0000 0000 0000 0000 0000 0000 0001
  -----------------------------------
  1000 0000 0000 0000 0000 0000 0000 0000

是不是觉得最高位为 符号位,1000 0000 0000 0000 0000 0000 0000 0000的十进制应该是 -0 ,但是结果却是-2147483648。
因为计算机以补码的形式来存储负数。
为什么呢?为了方便运算

如果以原码形式存储运算是这样的:
  0000 0001
+  1000 0001
  --------------
  1000 0010   即 -2,结果是不对的

后来又引入了反码,但是反码并不能对 -0 很好的表示,使得二进制与十进制的互换不再是一一对应的关系。所以被舍弃了,引入了补码

原码 ---> 补码
原码 ---符号位不动取反--> 反码 ---加1---> 补码

补码 ---> 原码
补码 ---减1---> 反码 ---符号位不变取反---> 原码

下面这种临界点,被人为规定了其代表值(代替了-0)
-2147483648 ---> 1000 0000 0000 0000 0000 0000 0000 0000
-32768 ---> 1000 0000 0000 0000
-128 ---> 1000 0000

结论:

可以简单的认为,某数据类型表示的范围是一个首尾相连的闭环(eg: min ---> 0 ---> max ---> min)

上一篇 下一篇

猜你喜欢

热点阅读