java关键字(一)——byte,int,long,short

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/qq_34966814/article/details/78057958

byte 是 Java 原始类型。byte类型简称“字节型”,用于表示整数。
int 是 Java 原始类型。 int类型简称“整型”,用于表示整数。
short是java原始类型。 short类型简称“短整型”,用于表示整数。
long是java原始类型。 long类型简称“长整型”,用于表示整数。
byte、short、int、long 的初始默认值皆为 0 。


1. 取值范围

(1) byte

  • byte类型占1个字节,即8位,其中最高位为符号位。
    所以,byte类型的取值范围为28 ~ 271
    128 ~ 127

(2) int

  • int类型 占4个字节,即32位,其中最高位为符号位。
    所以,int类型的整数取值范围为: 231~2311
    2147483648 ~ +2147483647

(3) short

  • short类型占2个字节,即16位,其中最高位为符号位。
    所以,short类型的整数取值范围为: 215~2151
    32768 ~ +32767

(4) long

  • long类型占8个字节,即64位,其中最高位为符号位。
    所以,short类型的整数取值范围为: 263~2631
    9223372036854775808 ~ +9223372036854775807

2. 数据溢出

这里讨论的“数据溢出”是指数据超出所定义数据类型的范围。

先看 一段代码(代码1):

        byte a=127;
        byte b=-128;

        System.out.println("a+1="+(a+1));
        System.out.println("b+1="+(b-1));

运行结果为:
a+1=128
b-1=-129

再看另一段代码(代码2):

        byte a=127;
        byte b=-128;

        System.out.println("(byte)(a+1)="+(byte)(a+1));
        System.out.println("(byte)(b-1)="+(byte)(b-1));

运行结果为:
(byte)(a+1)=-128
(byte)(b-1)=127

  • 讨论1:为什么代码1的运行结果能超出byte类型的取值范围?
          因为在程序中,整数是默认为int类型的,即“1”是一个int类型的整数。当两个不同数据类型的数进行运算时,先将低级别的数据类型转换为高级别的数据类型后在进行运算。例如,一个byte类型的数与一个int类型的数相加,byte类型的数先转换成int类型,在进行相加,得出的结果也为int类型。但若为byte类型或short类型的数据运算后,不加强制转换,结果会为int类型。
    数据类型级别:
    byte–>short–>int–>long–>double<–float

  • 讨论2:为什么byte类型最小值不是-127(11111111),而是-128?
          整数在计算机中以原码的形式存在的,负数在计算机中是以其补码形式存在的,就是负数的绝对值的原码转为二进制再按位取反后加 1 。
           我们先来看20与-20这个例子:20原码:0001 0100 它在计算机中的存储就是 0001 0100,-20 按照前面说的算,其绝对值为 20,转为二进制 ,0001 0100按位取反 1110 1011 再加 1 后:1110 1100,此为-20补码 ,好的,计算机中的1110 1100就是代表 -20 了。
           再来看 -128:-128 绝对值为 128,转换为二进制,1000 0000 按位取反0111 1111 再加 1 后为1000 0000,此为 -128 的补码,因此计算机中1000 0000就可以代表 -128 了。(short、int、long 类型的取值范围也是这样计算)

  • 讨论3: 当数据溢出时数据是怎样变化的?
           当二进制数的首位为 0 时,该数为正数;当二进制数的首位为 1 时,该数为负数。
           下面以 byte 类型数据进行讨论,结果强制转换为 byte 类型:“127+1=128”,这样的计算在计算机中会发生溢出,得出的结果不会为 128,二是 -128 (如上面的代码 2)。其原因是:0111 1111 + 1 = 1000 0000 , 1000 0000 首位为 1 ,代表负数。因为 1000 0000是 -128 的补码,所以“127+1=-128“。
           当溢出使得数据结果超过 8 位,则只取低 8 位进行计算:”127 + 256 = 383“ ,388 用二进制表示为 1 0111 1111 ,已经超过 8 为,所以只去低 8 位 0111 1111 。0111 1111 首位为 0 ,代表整数。因为 0111 1111 为 127,所以”127 + 256 = 127“。
    (short、int、long 类型数据溢出后规律与 byte 类型一样)


三. int 与 Integer 的区别

(byte 与 Byte 、short 与 Short 、long 与 Long 的区别皆和 int 与 Integer 的区别类似)

int 是语言本身的最基本的类型,而 Integer 是基于 int 的一个包装类,它有属性及方法。

对于包装类说,这些类的用途主要包含两种:
a. 作为和基本数据类型对应的类类型存在,方便涉及到对象的操作。
b. 包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法。

Interger 在 java.lang 包中是这样定义的(代码3):

 public Integer(int value) {
        throw new RuntimeException("Stub!");
    }

因此在程序中创建一个 Integer 对象的方式为(代码4):

Integer in=new Integer(5);
  • Integer 类中的字段、方法

字段摘要

类型 字段名 意义
static int MAX_VALUE 保持 int 类型的最大值的常量可取的值为 231-1。
static int MIN_VALUE 保持 int 类型的最小值的常量可取的值为 -231。
static int SIZE 以二进制补码形式表示 int 值的位数。
static Class TYPE 表示基本类型 int 的 Class 实例。

方法摘要

返回值类型 方法名(参数) 作用
static int bitCount(int i) 返回指定 int 值的二进制补码表示形式的 1 位的数量。
byte byteValue() 以 byte 类型返回该 Integer 的值
int compareTo(Integer anotherInteger) 在数字上比较两个 Integer 对象。
static Integer decode(String nm) 将 String 解码为 Integer。
double doubleValue() 以 double 类型返回该 Integer 的值。
boolean equals(Object obj) 比较此对象与指定对象。
float floatValue() 以 float 类型返回该 Integer 的值。
static Integer getInteger(String nm) 确定具有指定名称的系统属性的整数值。
static Integer getInteger(String nm, int val) 定具有指定名称的系统属性的整数值。
static Integer getInteger(String nm, Integer val) 返回具有指定名称的系统属性的整数值。
int hashCode() 返回此 Integer 的哈希码。
static int highestOneBit(int i) 返回具有至多单个 1 位的 int 值,在指定的 int 值中最高位(最左边)的 1 位的位置。
int intValue() 以 int 类型返回该 Integer 的值。
long longValue() 以 long 类型返回该 Integer 的值。
static int lowestOneBit(int i) 返回具有至多单个 1 位的 int 值,在指定的 int 值中最低位(最右边)的 1 位的位置。
static int numberOfLeadingZeros(int i) 在指定 int 值的二进制补码表示形式中最高位(最左边)的 1 位之前,返回零位的数量。
static int numberOfTrailingZeros(int i) 返回指定的 int 值的二进制补码表示形式中最低(“最右”)的为 1 的位后面的零位个数。
static int parseInt(String s) 将字符串参数作为有符号的十进制整数进行分析。
static int parseInt(String s, int radix) 使用第二个参数指定的基数,将字符串参数解析为有符号的整数。
static int reverse(int i) 返回通过反转指定 int 值的二进制补码表示形式中位的顺序而获得的值。
static int reverseBytes(int i) 返回通过反转指定 int 值的二进制补码表示形式中字节的顺序而获得的值。
static int rotateLeft(int i, int distance) 返回根据指定的位数循环左移指定的 int 值的二进制补码表示形式而得到的值。
static int rotateRight(int i, int distance) 返回根据指定的位数循环右移指定的 int 值的二进制补码表示形式而得到的值。
short shortValue() 以 short 类型返回该 Integer 的值。
static int signum(int i) 返回指定 int 值的符号函数。
static String toBinaryString(int i) 以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式。
static String toHexString(int i) 以十六进制的无符号整数形式返回一个整数参数的字符串表示形式。
static String toOctalString(int i) 以八进制(基数 8)无符号整数形式返回一个整数参数的字符串表示形式。
String toString() 返回一个表示该 Integer 值的 String 对象。
static String toString(int i) 返回一个表示指定整数的 String 对象。
static String toString(int i, int radix) 用第二个参数指定的基数返回第一个参数的字符串表示形式。
static Integer valueOf(int i) 返回一个表示指定的 int 值的 Integer 实例。
static Integer valueOf(String s) 返回保持指定的 String 的值的 Integer 对象。
static Integer valueOf(String s, int radix) 返回一个 Integer 对象,该对象中保持了用第二个参数提供的基数进行分析时从指定的 String 中提取的值。
  • 注:如文中有错误及不合理的地方,欢迎指出!
展开阅读全文

没有更多推荐了,返回首页