zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    ARM学习笔记10——GNU ARM命令行工具
    ARM学习笔记9——ARM汇编汇编语言中的伪指令
    ARM学习笔记8——通用寄存器和存储器内容交换指令和软中断指令
    ARM学习笔记7——乘法指令
    ARM学习笔记6——程序状态寄存器访问指令
    ARM学习笔记5——程序状态寄存器
    ARM学习笔记4——加载存储指令
    ARM学习笔记3——数据处理指令
    ARM学习笔记2——分支跳转指令
    ARM学习笔记1——Arm寄存器与模式的关系
  • 原文地址:https://www.cnblogs.com/sjslove/p/14537985.html
Copyright © 2011-2022 走看看