外贸汽车网站有哪些,北京工商注册登记网官网,深圳网站策划推广,注册一个家政公司需要多少钱引言
本篇文章属于计算机基础通识#xff0c;主要讨论#xff1a;有符号类型、无符号类型的区别#xff0c;byte、int 等类型的取值范围#xff0c;最大值最小值的计算公式的由来#xff0c;原码、反码、补码转换公式。
有符号类型与无符号类型
在 Java 中的八大基本类…引言
本篇文章属于计算机基础通识主要讨论有符号类型、无符号类型的区别byte、int 等类型的取值范围最大值最小值的计算公式的由来原码、反码、补码转换公式。
有符号类型与无符号类型
在 Java 中的八大基本类型byte、short、int、long、float、double、boolean、char 中前六个为有符号类型。
有符号类型无符号类型bytebooleanshortcharint long float double
所谓有符号类型指的是这种类型本身可以表示负数和正数。注意与整数相互区分。
有符号类型都遵从相同的数值表示规则即最高位表示符号位。下面以 byte 为例进行讲解。
byte 类型的取值范围
我们知道byte 类型只表示一个字节那么它究竟是如何表示正数和负数的呢
对于有符号类型我们会将 byte 的 8 位分成两部分——符号位和数值位 那么byte 的取值范围就是 -2^7 ~ (2^7 - 1)即 -128 ~ 127。
为什么
首先我们知道进制、位数和取值范围是乘方的关系。底数代表进制指数代表位数所得结果就表示取值数量地址空间。如下图所示 对于正数取值范围表示的是能够表示的数字的个数是包含 0 的就好像数组中长度与最后一个数的索引值最大值也需要进行减 1 处理因此最大值就是 2^7 - 1即 127。
对于负数符号位用 1 表示然而如此一来就会出现 -0 和 0 这两个奇怪的数于是人为规定 1 000 0000 表示 byte 类型范围内的最小值。此时负数表示的情况下7 位数值的全部取值都表示一个对应的负数而正数要去掉 1 个 全 0 的值用来表示数字 0因此很明显负数要比正数多 1 个数。即 负数可以有 2^7 个于是最小的数就是 -2^7 即 -128。
原码、反码、补码
原码反码补码的产生过程就是为了解决计算机做减法和引入符号位正号和负号的问题。
原码(true form)是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位即最高位为符号位正数该位为0负数该位为10有两种表示0和-0其余位表示数值的大小。一般情况下原码就单独处理符号位的一种表示方式如 -5的8位原码是1000 0101-3 的 8位原码是 1000 00118 的原码是 0000 1000。注意如果某个负数取绝对值后超出位数所能表示的最大值比如 -128 取模后是128 超出了 byte 类型的表示最大值 127那么 -128 就没有原码。
反码是原码除符号位之外的按位取反。如 -5 的 8 为反码是 1111 1010-3 的反码是 1111 1100 8的反码是 0111 0111。 在计算机系统中数值一律用补码来表示和存储。 原因在于原码虽然简单直观但是计算的时候需要特别将符号位和数值位区分处理这无形增加了硬件的开销和复杂性而使用补码可以将符号位和数值位统一处理。
上面部分提到了有符号数的取值范围它们包含了许多负数然而如果单从表面上观察很难将一个负数与其计算机内部的二进制表现形式联系起来比如byte 类型的 -128它在计算机内部的表示是1000 0000-125 对应 1000 0011 。
那么我们就需要了解原码、反码、补码的转换规则才能快速完成 编码的转化。
首先对于正数来说人为规定原码、反码、补码完全一样。除了高位为 0 以外剩余的 数值位可以快速通过 2进制与 16进制的转化规则确定比如 byte 类型的 125 十六进制是7D那么原码、反码、补码都是 0111 1101 。
对于负数补码计算机中实际表示的编码的计算规则为原码取反再加一。 另外补码到原码的转换也可以通过 先取反再加一的方式得到不需要先减一再取反这样的特性降低了电路逻辑的复杂性也是补码流行起来的原因。
short、int 等有符号类型的类推
short 、 int 等其他有符号类型的值除了字节数不同、位数较多以外其他所有的规律都是类似的。
如int 类型它在计算机中以 4 个字节表示总共32 位最高位也同样表示 正负那么数值位总共就有 31 位那么 int 的表示范围就是 -2^31 ~ (2^31 - 1)。推理方式和 前面 byte 是完全一样的。
总之一定要记住在计算机中所有负数 都是由补码来表示的而正数 直接用原码表示但实际上也是补码只不过规定正数的补码、反码和 原码要完全一致。