数据类型和Max+1

作者: G_uest | 来源:发表于2019-07-23 18:13 被阅读0次

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)

相关文章

  • 数据类型和Max+1

    java基本数据类型 整数类型 浮点类型 字符类型 布尔类型 jvm中没有任何供boolean值专用的字节码指令b...

  • js产生随机数的方法,统计概率是否相近

    //产生从min-max之间的随机数 function getRandom(min,max) { //max+1的...

  • 计数排序

    排序简介 找出数组的最大值和最小值,创建新数组[max+1], 原数组值等于新数组下标时, 新数组值加一,最后把新...

  • 基本数据类型和引用数据类型区别

    基本数据类型 引用数据类型 基本数据类型和引用数据类型也有人叫原始数据类型和对象数据类型,拥有方法的类型和不能拥有...

  • JAVA之引用类型

    java中数据类型分为基本数据类型和引用数据类型。 1、引用数据类型 java中的数据类型分为基本数据类型和引用数...

  • 数据类型及判断

    JS中数据类型分为2种:基本数据类型和复杂数据类型(引用数据类型)。 【判断数据类型】typeof和instanc...

  • java

    数据类型分为:8大基础数据类型和3大引用数据类型。 基础数据类型和引用数据类型的区别: 1,基本数据类型变量声明之...

  • 深入理解JS的数据类型

    js数据类型主要分为基本数据类型和引用数据类型 基本数据类型和引用数据类型的区别:基本数据类型是对值得引用,引用数...

  • php 数据类型和数据类型转化

    一、数据类型 基础数据类型 复合数据类型 特殊数据类型 二、获取数据类型 三、打印数据类型和值 四、数据类型判断 ...

  • JavaScript中基本数据类型和引用数据类型的区别

    1、基本数据类型和引用数据类型ECMAScript包括两个不同类型的值:基本数据类型和引用数据类型。基本数据类型指...

网友评论

    本文标题:数据类型和Max+1

    本文链接:https://www.haomeiwen.com/subject/pxiglctx.html