java基础讲解

红太狼 2022-06-04 02:17 296阅读 0赞

没有使用strictfp

正如我们所熟知的那样,java分为八大基本数据类型,分别是:

整数类型:byte(1) short(2) int(4) long(8)
浮点类型:float(4) double(8)
字符类型:char
布尔类型:boolean(true|false)

ps:小容量的数据在计算时,jvm会将其自动转为大容量数据,而大容量数据要转为小容量的数据,需要我们手动去转型。

其他的全部为引用类型:String类,数组,自定义类

大容量的数据类型可以转化为小容量的数据类型时,需要在前面加上强制类型转化符, 否则,java虚拟机会自动捕捉这种错误(这就涉及到error和exception的区别),但 在转换的过程中,容易造成数据的失真

Java虚拟机会自动将小容量的数据类型转化为大容量的数据类型时
转型顺序为:short,byte,char–>int–>long–>float–>–>double
short,byte,char之间不能转换

浮点型的默认类型:double
整数的默认类型: int

  1. public class Test1 {
  2. public static void main(String[] args){
  3. testWithoutStrictfp();
  4. //steictfpTest();
  5. }
  6. /** * * 正如我们所熟知的那样,java分为八大基本数据类型,分别是:<br/> * 整数类型:byte(1) short(2) int(4) long(8) * <br> 浮点类型:float(4) double(8) * <br> 字符类型:char * <br> 布尔类型:boolean(true|false) * * <br>其他的全部为引用类型:String类,数组,自定义类 * * <br>大容量的数据类型可以转化为小容量的数据类型时,需要在前面加上强制类型转化符 * 否则,java虚拟机会自动捕捉这种错误(这就涉及到error和exception的区别),但 * 在转换的过程中,容易造成数据的失真 * * <br>Java虚拟机会自动将小容量的数据类型转化为大容量的数据类型时 * 转型顺序为:short,byte,char-->int-->long-->float-->-->double * * short,byte,char之间不能转换 * * <br>浮点型的默认类型:double * <br>整数的默认类型: int * * 原子性:一个事务或多个事务要么同时提交而不受任何因素的干扰,要么就不提交 * 有序性 * 可见性 * * @auhtor 念兮 * */
  7. private static void testWithoutStrictfp(){
  8. int i=10; //因为整形的数据类型,默认为int
  9. int j=8;
  10. System.out.println("i+j的数值为:"+(i+j));
  11. //因为是double类型,Java虚拟机将其默认地转型
  12. //因而,数据会出现失真
  13. double ijd=(i+j)*1.2;
  14. System.out.println(ijd);
  15. /** * 因为是float浮点类型,Java虚拟机为发将其转型为float类类型 * 因而,我们需要将其手动转型 */
  16. float ijf=(float)((i+j)*1.2);
  17. System.out.println(ijf);
  18. /** * ijd的输出结果为:21.599999999999998 * ijf的输出结果为:21.6 * 因而,在数据进行转型的时候,就出现了数据的不一致 * * 怎么才能保证不失真呢,我们就需要用到strictfp这个保留字, * 它是script float potion 精准浮点,完全符合IEEE 754标准的 * IEEE745规定了硬件的数据的准确性,保罗单精度浮点数,和双精度浮点数 * 但它只能修饰类、接口、方法,不能修饰局部变量和成员变量 */
  19. /** * 这样也是报错,因为浮点数默认的是double,而不是float * 因而需要转型,即在10.0后面加上F/f */
  20. float f1=10;
  21. /** * 输出结果并不是10,而是10.0 */
  22. System.out.println("f1"+f1);
  23. float f2=10.0F;
  24. System.out.println("f2:"+f2);
  25. double strictfp_ijd=(i+j)*1.2;
  26. System.out.println(strictfp_ijd);
  27. float strictfp_ijf=(float)((i+j)*1.2);
  28. System.out.println(strictfp_ijf);
  29. System.out.println("f1/strictfp_ijf:"+f1/strictfp_ijf);
  30. System.out.println("f2/strictfp_ijf:"+f2/strictfp_ijf);
  31. short s1=10;
  32. /** * 这样就会报错,因为s1+1的结果类型不再是short,而是自动转型为int * 这是需要将大类型的int转换为小类型的short, */
  33. s1=(short)(s1+1);
  34. System.out.println(s1);
  35. /** * 但是 s1++就不会出现错误 */
  36. System.out.println(s1++);
  37. /** * byte 2^-8~2^8-1 即-128-127 */
  38. byte byte1=23;
  39. byte byte2=24;
  40. /** * 这样也会报错,因为byte1+byte2时,java虚拟机将其的类型转化为int了 * 如果,我们想要获取类型为byte的结果,就必须将其转型 * 但有一个重要的方法,它的输出结果为23,难道只输出了byte1吗? * * 答案是错误的,首先我们来了解byte这个基本数据类型,byte是字节类型的, * 它的取值范围是-128~127之间,占位是256位,也就是说,这是一个循环, * 我们全部将其转化为二进制(利用windows自带的计算器): * 23为10111<br> * 24为11000<br> * 1000为1111101000 * 对其进行二进制的加法可得:10000010111, * 而byte是八位的,因而只取00010111 * 首位是符号位,0表示正,1表示负 * 将其转化为十进制为:结果正好为23 * 因为,所有的代码在内存中都是二进制,即0和1表示 * 这是原码的加法,计算器组成原理的知识点 * * 这也就是黑客帝国中的二进制代码的看点 */
  41. byte byte3=(byte)(byte1+byte2+1000);
  42. System.out.println("byte:"+byte3);
  43. /** * 如果我们赋值的结果是100000000000000000000000,那么就会报错 * 因为l的长度是:-2^63-2^63-1,这远远超过了长度 * * 但问几遍我们写成这样:10000000000000000,没有超过长度,依然会报错 * 因为,Java虚拟机的整形数据类型默认为int,而这确实long类型,当然会报错 * 一般我们在末尾加上L/l,我们一般不用小写的l,因而这看起来其极像阿拉伯数字1 * 因而,我们一般写成为L; */
  44. long l1=10000000000L;
  45. long l2=(long)1E10; //用科学计数法需要转型
  46. double d1=l1+l2;
  47. /** * 输出结果为:2.0E18 采用的科学计数法,因为是double类型的浮点数 * * “aEb”所表示的值是a × 10b E/e表示10,b表示指数 * 但我们国家一般要求科学计数法不是这样的,可以参见: * GB3101-1993,GBT15835-2011,GBT8170-2008 * 而是a*10b; */
  48. System.out.println(d1);
  49. /** * float fd=d1/l1;这是会报错的,因为需要进行转型 */
  50. float fd=(float)d1/l1;
  51. System.out.println(fd);
  52. float f4=10000000.6F; //转型时,符合四舍五入的方法,满6才进1
  53. float f5=10000000.5F;
  54. long l4=(long)f4;
  55. long l5=(long)f5;
  56. System.out.println(l4);
  57. System.out.println(l5);
  58. }
  59. }

使用strictfp

如果想要精度更加准确,而且不会因为硬件的改变而失真, 我们可以用strictfp来修饰。它是script float potion 精准浮点,完全符合IEEE 754标准的。 IEEE745规定了硬件的数据的准确性,包括单精度浮点数,和双精度浮点数。但它只能修饰类、接口、方法,不能修饰局部变量和成员变量

  1. private static strictfp void steictfpTest(){
  2. int i=10; //因为整形的数据类型,默认为int
  3. int j=8;
  4. float f=10.0f;
  5. double strictfp_ijd=(i+j)*1.2;
  6. System.out.println(strictfp_ijd);
  7. float strictfp_ijf=(float)((i+j)*1.2);
  8. System.out.println(strictfp_ijf);
  9. System.out.println(f/strictfp_ijf);
  10. System.out.println(System.class);
  11. }

i++和++i的区别

  1. private static void testPlusPlus(){
  2. int i,i1=20;
  3. /** * 这种表示i先获得i1++的数值,然后i1在自行加1 * * 换句话说,i1把初始值赋给i后,i1再自行加1 */
  4. i=i1++;
  5. System.out.println("i的数值:"+i+"\ti1的数值:"+i1);
  6. /** * 这种方式表示,i先进行加1的计算,再把值赋给i; */
  7. i=++i1;
  8. System.out.println("i的数值:"+i+"\ti1的数值:"+i1);
  9. }

发表评论

表情:
评论列表 (有 0 条评论,296人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java基础讲解

    没有使用strictfp 正如我们所熟知的那样,java分为八大基本数据类型,分别是: 整数类型:byte(1) short(2) int(4) long(8)

    相关 Redis基础讲解

    前言:本文章为慕课网上Java企业级电商项目架构演进之路Tomcat集群与Redis分布式的学习笔记.供本人复习之用. 目录 第一章 redis的安装与启动 1.1 li