java基本数据类型所占用的内存空间大小

一、基本数据类型

  Java语言提供了八种基本类型。六种数值类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。

  java中基本数据类型中没有无符号类型(C、C++中有),只有有符号类型。

 

在计算机内,定点数有3种表示法:原码、反码和补码

原码 :二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
反码 :正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
补码 :正数的补码与其原码相同;负数的补码是将其原码的除符号位外的所有位,逐位取反,然后加1。

 

  计算机中数据的运算都是通过补码进行的。

  反码是为了解决减法运算,补码是为了解决反码产生的±0的问题。

  计算机中负数是用补码的形式保存、并用它参与加减法运算的,减法会被转换为加法,计算机中没有减法运算。

在计算机中减法运算可以转换成加法运算,比如8-1 -->  8+(-1) = 7

  • 原码:

     8:   0000 1000

    -1:  1000  0001 

  • 反码:

    8:   0000 1000

     -1:   1111  1110

  • 补码:

    8: 0000  1000

      -1: 1111   1111

  • 补码运算:

        (0000 1000) + (11111111) =  0000 0111  -->   4+2+1=7

 

比如:-128+127  -->  127+(-128) = -1

     0111 1111  + (1000 0000) = 1111 1111(补码)  --> 1111 1110(反码) -->  1000 0001(原码)  -->  -1  

  

计算机都是以补码来存储的:
   ⑴一个数为正,则它的原码、反码、补码相同。
   ⑵一个数为负,则符号位为1,其余各位是对原码取反(符号位不变),然后整个数加1。

先用一个正数1举例

原码:0000 0001

反码:0000 0001

补码:0000 0001

正数的原码=反码=补码

 

对于-1来说

原码:1000 0001

反码:1111 1110(符号位不变,其他相反)

补码:1111 1111(补码是反码+1)

  Java中用补码表示二进制数。

 

1、数值类型

 (1)byte    

    • byte数据类型是8位、有符号的以二进制补码表示的整数;(1字节 = 8位  )  Java中正数用源码表示,负数用补码表示,第一位是符号位。

    • 最小值是 -128(-2^7);

    • 最大值是  127(2^7-1)  

参考链接:

https://blog.csdn.net/Rex_WUST/article/details/88419881?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242

+0的原码是0000 0000

-0的原码是1000 0000

实际上,”+0“和“-0”的原码统一为0000 0000

1000 0000没有使用(避免浪费),所以就将其分给了最小的负数 -128。

    • 默认值是0;

    • byte类型用在大型数组中节约空间,主要代替整数,因为byte变量占用的空间只有int类型的四分之一;
public class Test12 {
    public static void main(String[] args) {
        byte a = 127;
        System.out.println(a); //127
    }
}

相关面试题: 链接来源:

https://blog.csdn.net/lexiaowu/article/details/100056525?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242

  Java面试题 :byte a = (byte)128; 定义变量语句是否正确 

  

public class Test12 {

  public static void main(String[] args) {

    byte a = (byte) 128;

    System.out.println(a);

  }

}

正确

1. 首先,分析基本数据类型

    • 只写128,说明128是整型(int类型)

    • 128L 或128F 等等,说明是long类型(L),单精度浮点类型(F)

    • (byte)128中128是整型(int),只不过是强制类型转换为了 字节类型(byte)

2、byte b = (byte)128; 只出现了 字节类型(byte)和整型(int),对两者具体分析

    • 整型(int)在内存中占32位(4字节)

    • 字节类型(byte)在内存中占8位

      • 所以,经过强制类型转换,把int类型转化为byte类型,byte只保存了int类型的低8位,其它位都舍弃

      • 有符号类型,最高位都是符号位, 1表示负数, 0表示正数

    • 如下图解释:          

           

3. 分析128

       用-0的二进制补码表示到了 -128里面。

public class Test12 {
    public static void main(String[] args) {
        byte a = (byte) 128;
        System.out.println(a); //-0 --> -128
      
     int类型:

原码:0000 0000 0000 0000 0000 0000 1000 0000

反码:0000 0000 0000 0000 0000 0000 1000 0000

补码:0000 0000 0000 0000 0000 0000 1000 0000

     byte类型截取后8位,即:

原码:1000 0000(最高位为1,表示负数)

反码:1111 1111

补码:1000 0000(在补码的过程中,符号位不能改变),1000 0000表示的是最小值,所以是-128,这叫上溢

        byte b = (byte) 129;
        System.out.println(b); //-127

  int类型:

原码:0000 0000 0000 0000 0000 0000 1000 0001 

反码:0000 0000 0000 0000 0000 0000 1000 0001 

补码:0000 0000 0000 0000 0000 0000 1000 0001 

  byte类型: 

原码:1000 0001

反码:1111 1110

补码:1111 1111(也就是-127)

        byte c = -128;
        System.out.println(c); //-128

        byte d = (byte) (-129);
        System.out.println(d); //127

int类型存储

原码:1000 0000 0000 0000 0000 0000 1000 0001

反码:1111 1111 1111 1111 1111 1111 0111 1110

补码:1111 1111 1111 1111 1111 1111 0111 1111

  byte类型

原码:0111 1111

反码:0111 1111

补码:0111 1111(值是127)

    }
}
byte: -128 ~ 127
  • 对于整数超出取值范围时:

    1、首先要计算出数据的二进制

    2、做截取操作,截成byte类型(取低8位)

    3、截取8位后,求补码

 

 (2)short

    • short数据类型是16位、有符号的以二进制补码表示的整数。(2字节)

    • 最小值是 -32768(-2^15);

    • 最大值是  32767(2^15 - 1);

    

    • Short数据类型也可以像byte那样节省空间。一个short变量是int型变量所占空间的二分之一;

    • 默认值是0;

public class Test12 {
    public static void main(String[] args) {
       
        short s = 1000;
        System.out.println(s); //1000

        short r = -20000;
        System.out.println(r); //-20000
    }
}

 

 

  (3)int

    • int数据类型是32位、有符号的以二进制补码表示的整数;(4字节)

    • 最小值是 -2147483648(-2^31);

    • 最大值是  2147483647(2^31 - 1);

    • 一般地整型变量默认为int类型;

    • 默认值是0;

 

  (4)long

    • long数据类型是64位、有符号的以二进制补码表示的整数;(8字节)

    • 最小值是 -9223372036854775808(-2^63);

    • 最大值是  9223372036854775807(2^63 -1);

    • 这种类型主要使用在需要比较大整数的系统上;

    • 默认值是0L;

 

  (5)float

    • float数据类型是单精度、32位、符合IEEE 754标准的浮点数;(4字节)

    • float在储存大型浮点数组的时候可节省内存空间;

    • 默认值是0.0f;

    • 浮点数不能用来表示精确的值,如货币;

    • 例子:float f1 = 234.5f。

 

  (6)double

    • double数据类型是双精度、64位、符合IEEE 754标准的浮点数;(8字节)

    • 浮点数的默认类型为double类型;

    • double类型同样不能表示精确的值,如货币;

    • 默认值是0.0d;

    • 例子:double d1 = 123.4。

 

2、字符类型

  (1)char

    • char类型是一个单一的16位Unicode字符;(2字节)

    • 最小值是’\u0000’(即为0);

    • 最大值是’\uffff’(即为65,535); 2的16次方 -1 (2^16 -1)

    • char数据类型可以储存任何字符;

    • 例子:char letter = ‘A’。

           

public class Test12 {
    public static void main(String[] args) {

        System.out.println(Character.SIZE); //16
        // 以数值形式而不是字符形式将Character.MAX_VALUE输出到控制台
        System.out.println((int)Character.MAX_VALUE); //65535
        System.out.println((int)Character.MIN_VALUE); //0
    }
}

 

 

3、布尔类型

 (1)boolean

    • boolean数据类型表示一位的信息;

    • 只有两个取值:true和false;

    • 这种类型只作为一种标志来记录true/false情况;

    • 默认值是false;

    • 例子:boolean one = true。

 

posted @ 2021-03-15 15:44  sjslove  阅读(4139)  评论(0编辑  收藏  举报