有符号类型和无符号类型

负数在计算机中如何表示呢?

1、是否需要有正负。

如果这个量不会有负值,那么我们可以使用无正负的类型。

分正负的类型,称为有符号类型;无正负的类型(只有正值),称为无符号类型。

2、使用二制数中的最高位表示正负。

(第一位为最高位)

单字节数: 1111 1111

双字节数: 1111 1111 1111 1111

四字节数: 1111 1111 1111 1111 1111 1111 1111 1111

当一个数是无符号类型时,那么其最高位的1或0,和其它位一样,用来表示该数的大小。

当一个数是无符号类型时,最高数称为“符号位”。为1时,表示该数为负值,为0时表示为正值。

3、无符号类型和有符号类型的范围区别。

无符号类型中,所有的位都用于直接表示该值的大小。我们举一个字节的数值对比:

无符号类型: 1111 1111 值:255 1* 27 + 1* 26 + 1* 25 + 1* 24 + 1* 23 + 1* 22 + 1* 21 + 1* 20

有符号类型: 0111 1111 值:127 1* 26 + 1* 25 + 1* 24 + 1* 23 + 1* 22 + 1* 21 + 1* 20

同样是一个字节,无符号类型的最大值是255,而有符号类型的最大值是127。原因是有符号类型中的最高位被挪去表示符号了。

有符号类型的长处是它可以表示负数。虽然它的在最大值缩水了,却在负值的方向出现了伸展。我们仍用一个字节的数值对比:

无符号类型: 0 —————————–255

有符号类型: -128 ——— 0 ———- 127

二者能表达的数值的个数都是256个。无符号类型表达的是 0~255 这256个数,有符号类型表达的是 -128 ~ 127这256个数。

有符号类型的负数使用补码表示。

4. 原码、反码、补码

有 int 类型的数,值为5,那么,我们知道它在计算机中表示为:

00000000 00000000 00000000 00000101

如果是 -5,在计算机中如何表示? 负数以补码表达。

(1)原码:一个整数,按照绝对值转换成的二进制数,称为原码。

比如 00000000 00000000 00000000 00000101 是5和-5 的原码。

(2)反码:原码按位取反,就是反码。

取反操作指:1变0; 0变1

00000101每一位取反,得11111010。

(3)补码:补码=反码+1。

00000101 的反码是:11111010。

补码 = 11111010 + 1 = 11111011

-5在计算机中表达为:11111011。转换为十六进制:0xFB。

我们来看int型整数-1在计算机中如何表示:

1、先得原码: 00000001

2、得反码: 11111110

3、得补码: 11111111

-1在计算机里用二进制表达就是全1。16进制为:0xFF。

6、java中只有有符号的数据类型
那对于java的数据类型,我们就只有有符号的数据类型了,如short 的表示范围 -128到+127,这就是代表有符号的数据类型了。

java没有无符号类型,都是有符号类型的数据类型。但是其它语言,如c的unsigned short 无符号数,它值的范围就是要从0开始,并且比java的short类型保存的数据范围更大。

在实际开发中,可能要与c写的硬件接口,网络接口相互直接数据交互,此时由于java没有无符号的数据类型,导致java与c看似相同的数据类型,其实存储空间确是不同的,这个问题解决方法是java用更高的存储数据类型,如果c用int,你的java就要考虑用Long或者BigInteger了。还有一种方法就是用java的guava框架来实现你的目标了。你自个其实也可以写,但是容易出问题哦。


参考文章https://blog.csdn.net/android_bar/article/details/76571925
参考文章https://www.cnblogs.com/huzi007/p/6566567.html

猜你喜欢

转载自blog.csdn.net/Growing_way/article/details/81874420