JAVA中的数值的有符号无符号操作

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


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值