Java中整数的三种表现形式:
十进制:0-9,逢10进1
八进制:0-7,逢8进1,以0开头表示
十六进制:0-9,A-F,逢16进1,以0x开头表示
在计算机中二进制数的表现形式:
正的二进制数的最高位为0,负的二进制数的最高位为1,由此可知,计算机中二进制数的最高位是符号位。
在计算机中如果用二进制表示负数,首先要将这个数的正数的二进制表现形式取反,然后再加1
这里拿Java中的byte(1字节-->8位)举例,如:
01111-1111---> 127(这个正数的二进制表现形式)↴
如果要表示-127,首先对127取反
0111-1111 ---> 1000-0000 ↴
然后再加1
1000-0000 ---> 1000-0001↴
如果要得到这个负的二进制数的正的二进制数的表现形式,要将这个负的二进制数取反,然后再加1
数据类型强转:
这里还是拿Java中的byte(1字节-->8位)举例,如:
1. byte b = 127; b = (byte) b + 1; b=?↴
0000-0000-0111-1111---> 127(首先在运算前会提升数据类型为int,这里为了书写方便,以short代替)↴
+0000-0000-0000-0001↴
=0000-0000-1000-0000 ---> 这时的结果为128,但是对结果进行了强转,导致前8位丢失,出现下面的情况↴
= 1000-0000 ---> 因为在计算机中二进制数的高位为符号位,这里为1,所以它是负数(-128), 然后对其执行下面的操作↴
= 0111-1111 ---> 首先对其进行取反↴
+ 0000-0001 ---> 再对其加1
= 1000-0000 ---> 这就是127+1再强转为byte在计算机中的二进制表现形式,对应十进制数-128
二进制移位:
<<(左移):被操作数乘以2的移动位数次幂(3 << 3 --> 3 * (2*2*2) --> 24)↴
0000-0000-0000-0011 << 3(左移3位后) ↴
0000-0000-0001-1000 ---> 24
>>(有符号右移,高位按原先高位值来补):被操作数除以2的移动位数次幂(-12 >> 2 --> -12 / (2*2) --> -3)↴
0000-0000-0000-0000-0000-0000-0000-1100 ---> 12 ↴
1111-1111-1111-1111-1111-1111-1111-0011 ---> 取反 ↴
+0000-0000-0000-0000-0000-0000-0000-0001 ---> +1 ↴
1111-1111-1111-1111-1111-1111-1111-0100 ---> -12(得到-12在计算机中的二进制表现形式) ↴
1111-1111-1111-1111-1111-1111-1111-1101 << 3 (右移2位后) ---> -3 ↴
0000-0000-0000-0000-0000-0000-0000-0010 ---> -3 (得到-3在计算机中的二进制表现形式) ↴
0000-0000-0000-0000-0000-0000-0000-0001 ---> +1 ↴
0000-0000-0000-0000- 0000-0000-0000-0011 ---> 3
>>>(无符号右移,高位补0):被操作数除以2的移动位数次幂(-12 >> 2 --> -12 / (2*2) --> 1073741821)↴
0000-0000-0000-0000-0000-0000-0000-1100 ---> 12 ↴
1111-1111-1111-1111-1111-1111-1111-0011 ---> 取反 ↴
+0000-0000-0000-0000-0000-0000-0000-0001 ---> +1 ↴
1111-1111-1111-1111-1111-1111-1111-0100 ---> -12 (得到-12在计算机中的二进制表现形式) ↴
00111111-1111-1111-1111--1111-1111-1101 <<< 3 (右移2位后,前两位为0,变成了正数) ---> 1073741821