Java 四种基本整型数据类型变量的操作限制
编译运行以下程序,可以得到Java四种基本整型数据类型:byte, short, int, 和 long 的取值范围。
public class Limits{
public static void main(String args[]){
/* 打印六种数字基本类型变量的最大值和最小值 */
System.out.println("长型最大值 LONG_Max: " + Long.MAX_VALUE);
System.out.println("长型最小值 LONG_Min: " + Long.MIN_VALUE);
System.out.println("整型最大值 Int_Max: " + Integer.MAX_VALUE);
System.out.println("整型最小值 Int_Min: " + Integer.MIN_VALUE);
System.out.println("短型最大值 SHORT_Max: " + Short.MAX_VALUE);
System.out.println("短型最小值 SHORT_Min: " + Short.MIN_VALUE);
System.out.println("字节型最大值 BYTE_Max: " + Byte.MAX_VALUE);
System.out.println("字节型最小值 BYTE_Min: " + Byte.MIN_VALUE);
}
}
输出:
长型最大值 LONG_Max: 9223372036854775807
长型最小值 LONG_Min: -9223372036854775808
整型最大值 Int_Max: 2147483647
整型最小值 Int_Min: -2147483648
短型最大值 SHORT_Max: 32767
短型最小值 SHORT_Min: -32768
字节型最大值 BYTE_Max: 127
字节型最小值 BYTE_Min: -128
知识要点:
- Java四种基本整型数据类型变量 (长型 long、整型 int、短型 short、和字节型 byte), 需要不同的存储空间(分别为 8、4、2、1 字节),表示不同的数据取值范围。
- Java 字节型 (byte)变量,需1 个字节的存储空间,所能表示的最大正整数为:2^7 - 1 = 127,最小负整数:-128。
- Java 整型 (int)变量,需4 个字节的存储空间,所能表示的最大正整数为:2^31 - 1 = 2147483647,最小负整数:-2147483648。
- Java 为每个基本数据类型(primitive data type)设计了一个对应的类, 来处理有关事宜。四个基本整型数据类型都对应有各自的包装类(或称外覆类或数据类型类, Wrapper Class)。
- 这四种基本整型数据类型的包装类分别是:Long、Integer、Short、和 Byte。 它们都用静态字段:MAX_VALUE 和MIN_VALUE 分别表明所能存储的最大正整数和最小负整数。
有效数据 Valid Data
N的阶乘是指 从1乘以2乘以3乘以4 一直乘到所要求的数 n!=1×2×3×……×n 或 n!=n×(n-1)!
程序分别通过 byte, short, int, long 类型变量计算阶乘,并使用 BigDecimal 和 BigInteger 进行对比计算,结果展示如图:
分析:
- 与其余较可靠渠道的计算结果相比, byte, short, int, long变量,先后分别第一次出现了6、8、13、21阶乘的“垃圾”数据。这四个单元格背景均标为红色。
- 在 字节型、短型、整形、和 长型 这四列里,每列 红单元格以下的单元格数据,都是“垃圾”。
- 选择 byte 为变量类型,只能正确计算最高 5 的阶乘; 选择 short, 最高7的阶乘;选择 int, 最高 12 的阶乘; 选择long, 最高20的阶乘。
选择的变量类型 | 最高能计算的阶乘 n! |
byte | 5 |
short | 7 |
int | 12 |
long | 20 |
- 通过 BigDecimal 和/或 BigInteger,才能得到更高(n>20)阶乘的数据。
供上述比较分析用的java程序代码,如下:
import java.math.BigDecimal;
import java.math.BigInteger;
import java.awt.Graphics;
import java.awt.Component;
import java.awt.Color;
import java.lang.*;
import javax.swing.*;
import javax.swing.table.TableColumn;
import javax.swing.table.DefaultTableCellRenderer;
public class Factorial_0 extends JFrame {
byte byteFac=1;//用字节型存储阶乘的变量,0阶乘为1
short shortFac=1;//用短型存储阶乘的变量,0阶乘为1
int iFactoria1=1;//用整型存储阶乘的变量,0阶乘为1
long lFactoria1=1;//用长型存储阶乘的变量,0阶乘为1
/*创建代表整数1的BigDecimal对象*/
BigDecimal bFactorial = new BigDecimal("1");
/*创建代表整数1的BigInteger对象*/
BigInteger big= new BigInteger("1");
/*创建储存数据的二维字符串类型的数组 data*/
String data[][]=new String[27][7];
/*创建表的列(字段)名称*/
String fields[] = {"阶乘", "用字节型", "用短型short", "用整型 int ",
"通过长型 long 计算", "使用 BigDecimal 计算","使用 BigInteger 计算"};
public static void main(String args[]) { //主方法代码块开始
new Factorial_0();
}//主方法代码块结束
public void makeFace(JTable table) { // 渲染单元格背景色 方法 makeFace 开始
try {
DefaultTableCellRenderer tcr = new DefaultTableCellRenderer() {
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
if (row % 2 == 0) {
setBackground(Color.white);//设置奇数行底色
} else if (row % 2 == 1) {
setBackground(new Color(255, 204, 255));//设置偶数行底色
}
if ((row == 5 && column == 1) || (row == 7 && column == 2)
|| (row == 12 && column == 3) || (row == 20 && column == 4))
setBackground(Color.red);
return super.getTableCellRendererComponent(table, value,
isSelected, hasFocus, row, column);
}
};
for (int i = 0; i < table.getColumnCount(); i++) {
table.getColumn(table.getColumnName(i)).setCellRenderer(tcr);
}
} catch (Exception ex) {
ex.printStackTrace();
}
} // 方法 makeFace 结束
public Factorial_0(){ //类 Factorial 的构造方法代码块 开始
super("查看用各种方法储存正整数的能力 :计算阶乘");
factorial();
JTable table = new JTable(data,fields);
table.getColumnModel().getColumn(0).setMaxWidth(70);
table.getColumnModel().getColumn(1).setMaxWidth(70);
table.getColumnModel().getColumn(2).setMaxWidth(70);
table.getColumnModel().getColumn(3).setMaxWidth(80);
table.getColumnModel().getColumn(4).setMaxWidth(200);
table.getColumnModel().getColumn(5).setMaxWidth(300);
table.getColumnModel().getColumn(6).setMaxWidth(300);
makeFace(table); // 调用 makeFace 方法,渲染单元格背景色
JScrollPane pane = new JScrollPane( table );//将table放入一个有滚动条的视口
getContentPane().add(pane);//将视口放置于带有标题和边框的顶层窗口JFrame
setVisible(true);
setSize(850,500);
} // 构造方法代码块 结束
public void factorial(){ // 方法 factorial() 计算阶乘开始
for (int i=1; i<27;i++){ //用for循环语句输出1到16的阶乘
byteFac *=i;
shortFac *=i;
iFactoria1 *=i; //将i的阶乘存入整型变量
lFactoria1 *=i; //将i的阶乘存入长型变量
bFactorial = bFactorial.multiply(new BigDecimal(Integer.toString(i)));
big = big.multiply(new BigInteger(Integer.toString(i)));
/*将数据以字符串形式存入二维数组data*/
data[i-1][0] = i + "的阶乘:";
data[i-1][1] = Byte.toString(byteFac); //将byte型数据转换成字符串型,存入data数组
data[i-1][2] = Short.toString(shortFac);//将short型数据转换成字符串型,存入data数组
data[i-1][3] = Integer.toString(iFactoria1);//将int型数据转换成字符串型,存入data数组
data[i-1][4] = Long.toString(lFactoria1);//将long型数据转换成字符串型,存入data数组
data[i-1][5] = bFactorial.toString();//将BigDecimal数据对象转换成字符串型,存入data数组
data[i-1][6] = big.toString();//将BigInteger数据实体转换成字符串型,存入data数组
}
/*将各种类型能表示的最大正整数值,以字符串形式存入二维数组 data 的最后一行 */
data[26][0]="MAX_VALUE";
data[26][1]= Byte.toString(Byte.MAX_VALUE);
data[26][2]= Short.toString(Short.MAX_VALUE);
data[26][3]= Integer.toString(Integer.MAX_VALUE);
data[26][4]= Long.toString(Long.MAX_VALUE);
data[26][5]="无 MAX_VALUE 字段";
data[26][6]="无 MAX_VALUE 字段";
} // 方法 factorial() 代码块结束
} // 类 Factorial_0 定义结束