整数的运算法则,java 整数

  整数的运算法则,java 整数

  00-1010介绍溢出自增/自减移位操作优先级类型自动提升和强制转换的实践总结

  

目录

Java的整数运算遵循四则运算规则,可以使用任何嵌套的括号。四则运算法则与初等数学一致。例如:

 

  public class Main { public static void Main(String[]args){ int I=(100 200)*(99-88);//3300 int n=7 *(5(I-9));//23072 system . out . println(I);system . out . println(n);}}输出

  330023072

  整数运算的数值不仅是精确的,而且总是精确的,即使在开始的时候也是如此,因为两个整数相除只能得到结果的整数部分,不需要四舍五入。

  int x=11/3;互补操作

  int x=11% 3;当被除数为0时,整数除法会报告错误,但在编译时不会报告错误。

  00-1010整数受范围限制。如果计算结果超出范围,就会溢出,溢出不会报错而是会得到一个奇怪的结果。

  public class Main { public static void Main(String[]args){ int x=2147483640;int y=15int sum=x y;system . out . println(sum);}}运行结果

  -2147483641

  为了解释上面的结果,我们把整数2147483640和15换成二进制进行加法。

  0111 1111 1111 1111 1111 1111 1111 1000

  0000 0000 0000 0000 0000 0000 0000 1111

  1000 0000 0000 0000 0000 0000 0000 0111

  因为最高位计算结果是1,所以加法结果变成负数。

  求解上面的文件,可以把int改成long,因为long表示的整数范围更大,所以结果不会溢出。

  public class Main { public static void Main(String[]args){ long x=2147483640;long y=15long sum=x y;system . out . println(sum);}}还有一个简写运算符,即=、-=、*=、/=,用法如下

  n=100//相当于n=n 100n-=100;//相当于n=n-100

  

引言

Java还提供了运算和-运算,可以在整数上加1和减1:

 

  public class Main { public static void Main(String[]args){ int n=100;n;system . out . println(n);n-;system . out . println(n);}}注意前后写的计算结果不一样。N表示在引用N之前加1,N表示在加1之前引用N。不建议把操作和常规操作混在一起,容易把自己搞糊涂。

  00-1010在计算机中,整数总是以二进制形式表示。例如,int类型的整数7使用由4个字节表示的二进制,如下所示:

  00000000 00000000 00000000 00000111

  你可以移动整数。将整数7左移1位得到整数14,左移2位得到整数28。

  int n=7;//000000000 00000000000000000000000000000111=7int a=n ^ 1;//000000000 00000000000000000000000000000000000001110=14int

  b = n << 2; // 00000000 00000000 00000000 00011100 = 28int c = n << 28; // 01110000 00000000 00000000 00000000 = 1879048192int d = n << 29; // 11100000 00000000 00000000 00000000 = -536870912左移29位时,由于最高位变成了1,因此结果变成了负数

  类似地对证书7进行右移结果如下

  

int n = 7; // 00000000 00000000 00000000 00000111 = 7int a = n >> 1; // 00000000 00000000 00000000 00000011 = 3int b = n >> 2; // 00000000 00000000 00000000 00000001 = 1int c = n >> 3; // 00000000 00000000 00000000 00000000 = 0

如果对一个负数进行右移,最高位1不动,结果仍然是一个负数

 

  

int n = -536870912;int a = n >> 1; // 11110000 00000000 00000000 00000000 = -268435456int b = n >> 2; // 10111000 00000000 00000000 00000000 = -134217728int c = n >> 28; // 11111111 11111111 11111111 11111110 = -2

还有一种不带符号的右移运算,使用>>>,它的特点是符号位跟着动,因此,对一个负数进行>>>右移,它会变成正数,原因是最高位的1变成了0:

 

  

int n = -536870912;int a = n >>> 1; // 01110000 00000000 00000000 00000000 = 1879048192int b = n >>> 2; // 00111000 00000000 00000000 00000000 = 939524096int c = n >>> 29; // 00000000 00000000 00000000 00000111 = 7int d = n >>> 31; // 00000000 00000000 00000000 00000001 = 1

对byte和short类型进行位移时,会首先转换为int再进行位移

 

  左移实际上就是不断地*2,右移实际上就是不断地/2

  

 

  

位运算

位运算是按位进行与,或,非和异或的运算。

 

  与运算的规则是,必须两个数同时为1,结果才为1

  

n=0 & 0;//0n=0 & 1;//0n=1 & 0;//0n=1 & 1;//1

或运算的规则是,只要任意一个为1,结果就为1

 

  

n = 0 0; // 0n = 0 1; // 1n = 1 0; // 1n = 1 1; // 1

非运算的规则是,0和1呼唤

 

  

n = ~0; // 1n = ~1; // 0

异或运算的规则是,如果两个数不同,结果为1,否则为0

 

  

n = 0 ^ 0; // 0n = 0 ^ 1; // 1n = 1 ^ 0; // 1n = 1 ^ 1; // 0

对于两个整数的运算,实际上就是按位对齐,然后依次对每一位进行运算。例如

 

  

public class Main { public static void main(String[] args) { int i = 167776589; int n = 167776512; System.out.println(i&n); }}

运行结果

 

  

167776512

 

  

上述按位与运算实际上可以看作两个整数表示的IP地址10.0.17.7710.0.17.0,通过与运算,可以快速判断一个IP是否在给定的网段内。

 

  

 

  

运算优先级

在Java的计算表达式中,运算优先级从高到低依次是:

 

  ()!~++--*/%+-<<>>>>>&+=-=*=/=记不住也没关系,只需要加括号就可以保证运算的优先级正确。

  

 

  

类型的自动提升与强制转型

在运算过程中,如果参与运算的两个数类型不一致,那么计算结果为较大类型的整型。例如,short和int计算,结果总是int,原因是short首先自动被转型为int:

 

  

public class Main { public static void main(String[] args) { short s = 1234; int i = 123456; int x = s + i; //s自动转换为int short y = s + i;//编译错误 }}

也可以将结果强制转型,即将大范围的整数转型为小范围的整数。强制转型使用(类型),例如,将int强制转型为short:

 

  

int i=12345;short s = (short) i;//12345

超出范围的强制转型会得到错误的结果,原因是转型时,int的两个高位直接直接被扔掉,仅保留了低位的两个字节。

 

  举例说明

  

public class Main { public static void main(String[] args) { int i1 = 1234567; short s1 = (short) i1; // -10617 System.out.println(s1); int i2 = 12345678; short s2 = (short) i2; // 24910 System.out.println(s2); }}

结果

 

  

-1061724910

 

  

为什么结果是-10617和24910呢

 

  首先把1234567转换成二进制并且使用8位分割成4份

  00000000 00010010 11010110 10000111‬

  强制转换成short类型或高位被抛弃留下低位两个字节

  11010110 10000111

  最高位为1是负数,负数是以补码的形式存储在计算机内需要转换成原码

  原码等于补码-1后除符号位取反

  补码-1结果

  11010110 10000110

  除符号位取反得到原码

  10101001 01111001

  最高位为1所以是负数101001 01111001即-10617

  同理计算12345678去掉高两位后剩下的最高位为0是正数则补码和原码是一样的

  

 

  

练习

计算自然数之和

 

  

public class Main { public static void main(String[] args) { int n=100; int sum=0; for(int i=1;i<=n;i++) { sum=sum+i; } System.out.println(sum); }}

 

  

小结

整数运算的结果永远都是精确的

 

  运算结果会自动提升

  可以强制转型,但超出范围的强制转型会得到错误的结果

  应该选择合适范围的整型(int或long),没有必要为了节省内存而使用byte和short进行整数运算。

  

 

  

总结

到此这篇关于Java基础教程之整数运算的文章就介绍到这了,更多相关Java整数运算内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

 

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: