Skip to content

关于无符号数包装类型

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