文档章节

保证程序运行整型数据有效

tcxu
 tcxu
发布于 2017/08/29 16:11
字数 1758
阅读 31
收藏 0

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 定义结束

 

© 著作权归作者所有

共有 人打赏支持
tcxu

tcxu

粉丝 57
博文 5
码字总数 4487
作品 0
海淀
其他
私信 提问
C语言数据类型中的基本类型

  变量的数据类型   在应用程序中,由于数据存储时所需要的容量各不相同,因此,为了区分不同的数据,需要将数据划分为不同的数据类型。C语言中的数据类型有很多种,具体分类如下图所示。...

C语言
2017/04/12
0
0
【Qt笔记】二进制文件读写

在上一章中,我们介绍了有关和两个类的使用。我们提到,提供了、等基本的操作。同时,Qt 还提供了更高一级的操作:用于二进制的流和用于文本流的。本节,我们将讲解有关的使用以及一些技巧。...

大道无名
2016/07/31
31
0
Qt 二进制文件读写

在上一章中,我们介绍了有关和两个类的使用。我们提到,提供了、等基本的操作。同时,Qt 还提供了更高一级的操作:用于二进制的流和用于文本流的。本节,我们将讲解有关的使用以及一些技巧。...

乔三爷
2016/09/27
15
0
大端模式&小端模式、主机序&网络序、入栈地址高低问题

一、大端模式&小端模式 所谓的“大端模式”,是指数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把数据当作...

AlphaJay
2010/06/13
0
0
进程标识符

进程ID是一个进程的基本属性,根据进程ID,用户可以精确地定位一个进程。一个进程标识符唯一对应一个进程,多个进程标识符可以对应同一个进程。 一、进程ID 每一个进程在系统中都有一个唯一的...

大道无名
2016/11/27
25
0

没有更多内容

加载失败,请刷新页面

加载更多

解析JQuery中each方法的使用

each() 方法规定为每个匹配元素规定运行的函数。写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下。如有不足之处,欢迎批评指正。 概述: each() 方法规定为每个匹配...

前端攻城小牛
10分钟前
1
0
深入解析Vue开发动态刷新Echarts组件的教程

需求背景:dashboard作为目前企业中后台产品的“门面”,如何更加实时、高效、炫酷的对统计数据进行展示,是值得前端开发工程师和UI设计师共同思考的一个问题。今天就从0开始,封装一个动态渲...

peakedness丶
23分钟前
3
0
memcached

memcached 为了避免内存碎片化(传统的内存管理方式是,使用完通过malloc分配的内存后通过free来回收内存,这种方式容易产生内存碎片并降低操作系统对内存的管理效率),采用了 slab allocatio...

Cobbage
23分钟前
2
0
keepalived的介绍及配置高可用集群

12月19日任务 18.1 集群介绍 18.2 keepalived介绍 18.3/18.4/18.5 用keepalived配置高可用集群 集群介绍 根据功能划分为2类:高可用和负载均衡 高可用集群:通常为两台服务器,一台工作,另外...

robertt15
24分钟前
5
0
WiFi攻击的三种方式

导读 WiFi的安全问题已经引起了不少的使用者重视,甚至已经出现草木皆兵的现象。那么黑客到底是如何做到绕过身份验证来获取WiFi使用权的呢?主要有以下三种方式,其中最后一种方式十分简单。 ...

问题终结者
38分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部