java基础问题02
来源:互联网 发布:unity3d室内设计 编辑:程序博客网 时间:2024/05/16 04:38
9、请设计一个一百亿的计算器
首先要明白这道题目的考查点是什么,一是大家首先要对计算机原理的底层细节要清楚、要知道加减法的位运算原理和知道计算机中的算术运算会发生越界的情况,二是要具备一定的面向对象的设计思想。
首先,计算机中用固定数量的几个字节来存储的数值,所以计算机中能够表示的数值是有一定的范围的,为了便于讲解和理解,我们先以byte 类型的整数为例,它用1个字节进行存储,表示的最大数值范围为-128到+127。-1在内存中对应的二进制数据为11111111,如果两个-1相加,不考虑Java运算时的类型提升,运算后会产生进位,二进制结果为1,11111110,由于进位后超过了byte类型的存储空间,所以进位部分被舍弃,即最终的结果为11111110,也就是-2,这正好利用溢位的方式实现了负数的运算。-128在内存中对应的二进制数据为10000000,如果两个-128相加,不考虑Java运算时的类型提升,运算后会产生进位,二进制结果为1,00000000,由于进位后超过了byte类型的存储空间,所以进位部分被舍弃,即最终的结果为00000000,也就是0,这样的结果显然不是我们期望的,这说明计算机中的算术运算是会发生越界情况的,两个数值的运算结果不能超过计算机中的该类型的数值范围。由于Java中涉及表达式运算时的类型自动提升,我们无法用byte类型来做演示这种问题和现象的实验,大家可以用下面一个使用整数做实验的例子程序体验一下:
int a = Integer.MAX_VALUE;
int b = Integer.MAX_VALUE;
int sum = a + b;
System.out.println(“a=”+a+”,b=”+b+”,sum=”+sum);
先不考虑long类型,由于int的正数范围为2的31次方,表示的最大数值约等于2*1000*1000*1000,也就是20亿的大小,所以,要实现一个一百亿的计算器,我们得自己设计一个类可以用于表示很大的整数,并且提供了与另外一个整数进行加减乘除的功能,大概功能如下:
()这个类内部有两个成员变量,一个表示符号,另一个用字节数组表示数值的二进制数
()有一个构造方法,把一个包含有多位数值的字符串转换到内部的符号和字节数组中
()提供加减乘除的功能
public class BigInteger
{
int sign;
byte[] val;
public Biginteger(String val)
{
sign = ;
val = ;
}
public BigInteger add(BigInteger other)
{
}
public BigInteger subtract(BigInteger other)
{
}
public BigInteger multiply(BigInteger other)
{
}
public BigInteger divide(BigInteger other)
{
}
}
10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。例如,对于如下语句: final StringBuffer a=new StringBuffer("immutable"); a=new StringBuffer(""); a.append(" broken!"); 有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象: public void method(final StringBuffer param) { } 实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象: param.append("a");
执行如下语句将报告编译期错误:
但是,执行如下语句则可以通过编译:
- java基础问题02
- java基础问题请教!
- Java几个基础问题
- Java基础 问题
- java基础问题大全
- JAVA初学基础问题
- 子父类问题.JAVA基础
- java基础问题
- JAVA经典基础问题
- java 基础问题
- java 面试基础问题
- java基础问题
- java基础问题01
- java基础问题03
- java基础问题04
- java基础问题05
- java基础问题06
- java基础问题07
- (转载)Ubuntu 10.10 配置 Zend Framework
- boj 1334 思路混乱 弄了2个下午。。太笨了。。。 思路:先按起始时间排序,起始时间相同的,只保留结束时间最长的,然后判断。
- [Book] 对程序员最具影响的,每个程序员都应该阅读的书籍
- 推荐一篇关于多租户Multi-Tenant数据架构的文章
- Java 动态绑定详解
- java基础问题02
- 鸡尾酒排序的实现
- vim使用
- C++ static
- 纠结的比赛~
- SUSE安装Virtualbox addtion
- 点在多边形内的判断
- 判断点是否在多边形中
- 判断一个点是否落在多边形内