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

编程入门 行业动态 更新时间:2024-10-05 09:30:13

JAVA中的数值的有<a href=https://www.elefans.com/category/jswz/34/1770893.html style=符号无符号操作"/>

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


更多推荐

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

本文发布于:2024-02-28 05:07:06,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1768255.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:符号   数值   操作   JAVA

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!