所有数字在计算机底层都以二进制形式存在。
二进制(binary): 0,1 ,满2进1.以0b或0B开头。
十进制(decimal): 0-9 ,满10进1。
八进制(octal): 0-7 ,满8进1. 以数字0开头表示。
十六进制(hex): 0-9及A-F,满16进1. 以0x或0X开头表示。此处的A-F不区分大小写。
一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.
将带符号位的机器数对应的真正数值称为机器数的
真值
因为第一位是符号位,所以机器数的形式值就不等于真正的数值。
计算机以**二进制补码
**的形式保存所有的整数,即真值。
- 原码:直接将一个数值换成二进制数。最高位是符号位
- 正数的原码、反码、补码都相同
- 负数的反码:是对原码按位取反,只是最高位(符号位)确定为1。
- 负数的补码是其反码+1
eg.
对于二进制补码表示法,-10的真值可以通过以下步骤计算:
确定原码。-10的原码为10000000 00000000 00000000 00001010(即最高位为符号位,0表示正数,1表示负数)。
计算反码。将原码中除符号位之外的其他位取反得到反码,即11111111 11111111 11111111 11110101。
计算补码。将反码加1得到补码,即11111111 11111111 11111111 11110110。
因此,-10的真值用二进制补码表示为11111111 11111111 11111111 11110110。
为什么要使用原码、反码、补码表示形式呢?
计算机辨别“符号位”显然会让计算机的基础电路设计变得十分复杂! 于是人们想出了将符号位也参与运算的方法. 我们知道,
根据运算法则减去一个正数等于加上一个负数, 即: 1-1 = 1 + (-1) = 0 , 所以机器可以只有加法而没有减法,
这样计算机运算的设计就更简单了。
-128的补码 1000 0000
当java 128转为byte类型正128会变为-128
进制转换
十进制转二进制 除2取余
十进制转八进制 除8取余
十进制转十六进制 除16取余
如十进制257转换二进制 除2取余
1
0
0
0
0
0
0
0
1
从下往上写则二进制表示为100000001
十进制257转换八进制 除8取余
1
0
4
十进制257转换十六进制 除16取余
1
0
1
从下往上写则八进制表示为101
也可将二级制 分别取三为转换为8进制
100 4
000 0
001 1
转十六进制同理
0001 1
0000 0
0001 1
左移(<<)箭头指向作左边
符号位不变,将真值左移,左边二进制数丢弃,右边补0
eg. 5<<2
真值 00000101
左移后00010100
20 相当于5x2^2
eg -5<<2
真值
11111011
左移后 11101100
-20 相当于-5x2^2
右移(>>)箭头指向右边
符号位不变 真值右移,符号位0则左边补0,符号位位负数则左边补1,右边丢弃
eg. 10>>2
真值 00001010
右移后00000010
2 相当于10/2^2(向下取整 为2)
eg -10 >>2
真值11110110
右移后 11111101
-3 相当于-10/2^2 (向下取整 为-3)
->>>
是 无符号右移
->>
是有符号右移