1. 原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:
[1111 1111 , 0111 1111]
即
[-127 , 127]
原码是人脑最容易理解和计算的表示方式.
2. 反码
反码的表示方法是:
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算.
3. 补码
补码的表示方法是:
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.
Java一共有8种基本
数据类型
(原始
数据类型
):
类型 存储要求 范围(包含) 默认值 包装类
整 int 4字节(32位) -2^31~ 2^31-1 0 Integer
数 short 2字节(16位) -2^15~2^15-1 0 Short
类 long 8字节(64位) -2^63~2^63-1 0 Long
型 byte 1字节(8位) -2^7~2^7-1 0 Byte
浮点 float 4字节(32位) -3.4e+38 ~ 3.4e+38 0.0f Float
类型 double 8字节(64位) -1.7e+308 ~ 1.7e+308 0 Double
字符 char 2字节(16位) u0000~uFFFF(‘’~‘?’) ‘0’ Character
(0~2^16-1(65535))
布尔 boolean 1/8字节(1位) true, false FALSE Boolean
在计算机中,可以区分正负的类型,称为有符号类型,无正负的类型,称为无符号类型。
使用二进制中的最高位表示正负
一个字节为
8
位,按
0
开始记,那它的最高位就是第
7
位,
2
个字节,最高位就是
15
位,
4
个字节,最高位是
31
位,不同长度的类型,最高位虽不同,但总是最左边那位。
同样一个字节,无符号的最大值是
255
,有符号的最大值是
127
,下图是无符号数和有符号数的范围:
可以发现,1000 0000
没有拿来表示
-0
,而1000 0001
也不能拿来直观地表示
-1
,事实上,
-1
用1111 1111
来表示。从一个角度来理解,
-1
大还是
-128
大,当然是
-1
大,
-1
是最大的负整数,所以,无论是字符类型或整数类型,也无论这个整数是几个字节,从计算结果上来看也是对的:1111 1111-1
=1111 1110
,表示
-2
,这样一直减下去,当减到只身最高位用于表示符号的
1
以外,其他低位全为
0
,就是最小的负值,也就是
-128
:
Java的符号类型
Java
的原始类型里
没有
无符号类型,
如果需要某个宽度的无符号类型,可以用
>>>
,这个是
java
的无符号右移操作符,或者使用下一个宽度的带符号类型来模拟
,例如,需无符号的
short
,就用
int
来模拟:
int toUnsigned(short s) {
return s & 0xFFFF;
}
十进制的字面常量只有一个特性,就是
所有的十进制字面常量都是正数
,如果想写一个负的十进制,则需要在正的十进制字面常量前面加上“
-
”就好了。
十六进制或者八进制的字面常量就不一定是正数或者负数,如果最高位是
1
,那么就是负数:
System.out.println(0x80);//128
//0x81看作是int型,最高位(第32位)为0,所以是正数
System.out.println(0x81);//129
System.out.println(0x8001);//32769
System.out.println(0x70000001);//1879048193
//字面量0x80000001为int型,最高位(第32位)为1,所以是负数
System.out.println(0x80000001);//-2147483647
//字面量0x80000001L强制转为long型,最高位(第64位)为0,所以是正数
System.out.println(0x80000001L);//2147483649
//最小int型
System.out.println(0x80000000);//-2147483648
//只要超过32位,就需要在字面常量后加L强转long,否则编译时出错
System.out.println(0x8000000000000000L);//-922337203685477
有符号扩展和无符号扩展
因为java的基础类型都是有符号类型,所以java的类型强转及类型提升都是有符号扩展
(
即在前边补符号位,符号位是1前边就都补1,是0就都补0
)
例如:
System.out.println(Long.toHexString(0x100000000L + 0xcafebabe));// cafebabe
由于0x100000000L标识为Long型,8个字节表示,二进制没有占满8个字节,所以二进制表示会在0x100000000L前边补充0。
因为0x100000000L是字面常量,java不把字面常量前面的1看做符号。
而0xcafebabe是整型,4个字节表示,二进制刚好占满四个字节(
11001010 11111110 10111010 10111110
),即0xcafebabe为负数。
该程序执行的加法是一个混合类型的计算,long型加int型,java会将int类型提升为long类型进行运算,因为
0xcafebabe 的符号位为1,所以进行有符号扩展,变为11111111 11111111 11111111 11111111
11001010 11111110 10111010 10111110
计算机这样扩展的原因是扩展的long型仍表示的是
0xcafebabe。
类型提升后两值相加:
0x ffffffffcafebabeL
+0x 0000000100000000L
-----------------------------
0x 00000000cafebabeL
java窄的整型转换成较宽的整型时是有符号扩展,但是如果它是char,那么不管它将要被提升成什么类型,都执行零扩展。java从宽的整型转窄的整型时,是直接截取最低位的字节。
ASCII码表
ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 |
0 | NUT | 32 | (space) | 64 | @ | 96 | 、 |
1 | SOH | 33 | ! | 65 | A | 97 | a |
2 | STX | 34 | " | 66 | B | 98 | b |
3 | ETX | 35 | # | 67 | C | 99 | c |
4 | EOT | 36 | $ | 68 | D | 100 | d |
5 | ENQ | 37 | % | 69 | E | 101 | e |
6 | ACK | 38 | & | 70 | F | 102 | f |
7 | BEL | 39 | , | 71 | G | 103 | g |
8 | BS | 40 | ( | 72 | H | 104 | h |
9 | HT | 41 | ) | 73 | I | 105 | i |
10 | LF | 42 | * | 74 | J | 106 | j |
11 | VT | 43 | + | 75 | K | 107 | k |
12 | FF | 44 | , | 76 | L | 108 | l |
13 | CR | 45 | - | 77 | M | 109 | m |
14 | SO | 46 | . | 78 | N | 110 | n |
15 | SI | 47 | / | 79 | O | 111 | o |
16 | DLE | 48 | 0 | 80 | P | 112 | p |
17 | DCI | 49 | 1 | 81 | Q | 113 | q |
18 | DC2 | 50 | 2 | 82 | R | 114 | r |
19 | DC3 | 51 | 3 | 83 | S | 115 | s |
20 | DC4 | 52 | 4 | 84 | T | 116 | t |
21 | NAK | 53 | 5 | 85 | U | 117 | u |
22 | SYN | 54 | 6 | 86 | V | 118 | v |
23 | TB | 55 | 7 | 87 | W | 119 | w |
24 | CAN | 56 | 8 | 88 | X | 120 | x |
25 | EM | 57 | 9 | 89 | Y | 121 | y |
26 | SUB | 58 | : | 90 | Z | 122 | z |
27 | ESC | 59 | ; | 91 | [ | 123 | { |
28 | FS | 60 | < | 92 | / | 124 | | |
29 | GS | 61 | = | 93 | ] | 125 | } |
30 | RS | 62 | > | 94 | ^ | 126 | ` |
31 | US | 63 | ? | 95 | _ | 127 | DEL |