-
Notifications
You must be signed in to change notification settings - Fork 20
关于无符号数包装类型
ray.zh edited this page Jun 14, 2023
·
3 revisions
2.3.0版本新增属性
Java和C有一个明显的不同之处,C天然支持结构体和无符号数。而java却只支持有符号数。
在这里简单的回顾下有符号数和无符号数的区别:
首先大家应该都知道计算机储存的只会是二进制如:01100010
而这个二进制数据如何储存数值呢? 比如0x7f
,简单的做法是直接将其转换为二进制(01111111)然后进行储存。
那么有一个问题,负数又要怎么储存呢? 比如 -0x7f
,此时的做法是将正负号储存在第一位,接着再将0x7f
转为二进制进行储存。
说到这里大家应该明白,有符号数和无符号数的区别是计算机在将二进制数据转换为目标进制时,对最高位的处理:
- 有符号数中,二进制整体分为符号位和数值位;其中最高位为符号位,0代表正数,1代表负数
- 无符号数中,所有位都为数值位
那么在8bit计算机中,储存表示就会如下:
十六进制 | 二进制(十进制有符号) | 二进制(十进制无符号) | 解释 |
---|---|---|---|
0x3 | 00000011(3) | 00000011(3) | 二进制位相同, 最高位0 |
0x7F | 01111111(127) | 01111111(127) | 二进制位相同, 最高位0 |
0x80 | 10000000(-128) | 10000000(128) | 二进制位相同, 最高位1 |
0x87 | 10000111(-121) | 10000111(135) | 二进制位相同, 最高位1 |
从上表中可以看到,对于相同的二进制数据,只因为最高位不同,有符号数和无符号数的解析方式就不同了。
所以其实对于通讯来说,只要二进制数据相同即可,并不需要在意 0x87
在Java 中表示为 -121
而在C中表现为 135
。
因为最终的,影响业务表达的二进制数据是完全相同的。
所以最后再提到这个无符号数包装类型,其实只是一个过渡的东西,方便新手使用。笔者并不建议大家在项目中使用这个包装类型。
最好还是使用原始的数据类型byte,char,short,int,long
若大家在使用过程中有疑问,可以参考右边的目录列表进行查询