我们知道 1字节 (byte) = 8 位(bit)(即8位二进制,如:11111111)、1024个字节 = 1 K 、1024 K = 1M
所以,一字节可以表示的范围就有 0 ~ 256 (无符号数),而有符号数表示的范围则是: -128 ~ 127
无符号数的表示范围应该是无异议的,但是有符号数的表示范围就有门道了,为什么负数会多表示一位呢?
正常来讲,1 字节有八位,其中最左位表示正负(0为正,1为负)其余七位表示范围,所以正的最大数为:01111111(二进制) = 127(十进制)后面二进制和十进制的表示方法使用 二进制:0bxxxxxxxx(x为 1或者0),十进制:xxx
所以理所当然的 (表示正数时)0b00000000 表示 0,那么 (表示负数时)0b10000000 又表示多少呢?总不能也表示 0 吧,所以,理所当然的 0b10000000 就表示 -128 、这也就是为什么负数有第128位的原因。
正常间的进制转换规则:
先由十进制 转换为 二进制、然后 二进制 三位为一位的转换为 八进制 /或者四位为一位的转换为 十六进制。
例:
10 除以 2 = 5 余数为 0;
然后 5 除以 2 = 2 余数为 1;
2 除以 2 = 1 余数为 0;
1 除以 2 = 0 余数为 1;
直到结果为0时,从低至高的获取余数、即 10 的二进制为:1010
1010
= 1 * 2的三次方 + 0 * 2的2次方 + 1 * 2的1次方 + 0 * 2的0次方
= 8 + 0 + 2 + 0
= 10
三位二进制为一位八进制、即利用二进制转为十进制的方法去三位合并为一位。
例:
1010(二进制)
= 001 010 (因为原来为四位,可适当在最左添加 0 更好计算且不影响结果)
= 1 2
=12(八进制)
所以二进制 1010 的 八进制 为 12
同理、八 转 二 为:
12
= 1 2
又因为 1 的二进制为 001 、2 的 二进制 为 010 (保持三位为一个单位)
所以 = 001010 = 1010(二进制)
同理 二进制 变 八进制,但是以 4 位为一个单位。
即:
1010 = A (十六进制)(0~9 然后是 A~F,A相当于 10 、F 相当于 15)
同理,十六进制 变 二进制 略;
定基调:负数在计算机中以补码形式存在!
所以就要搞清楚什么是补码以及怎么得到补码?
首先,分为:原码、反码、补码、三种
是机器数中最简单的一种表示形式,其符号位为 0 表示正数, 符号位为 1 表示负数,数值位即真值的绝对值。
例:
+3 (十进制)的原码:
= 00000011 (二进制)
-3 的原码:
= 10000011
日常生活中会遇到补数这个概念、如时钟里、3 和 15 都可以表示下午三点,为什么呢?
假设现在时针指向 12 点、那么为使时针指向 3 点,则有两种方法:1、顺时针旋转分针 3 圈(一圈一小时)。2、逆时针旋转分针 9 圈 这两种方法的结果是一致的。假设顺时针为正、逆时针为负。那么 12 + 3 = 15(顺时针)、12 - 9 = 3(逆时针),由于时针转一圈12个小时相当于没有旋转、即 15 - 12 = 3 ,故 15 点和 3 点皆表示下午 3 点!这样 -3 和 +9 对时钟而言作用是一致的,又因为时钟 12 为一圈,是故:称之为 +9 是 -3 以 12 为模的补数。(参考自:北京理工大学出版社的计算机组成原理(潘雪峰 、、、著)P15页)
简而言之,在钟表里,为了使时针从 12 运动到 3 点,我们可让 分针 顺时针旋转 3 圈、或者逆时针旋转9圈。 3圈可以代表原码,9圈可以代表补码。
注:钟表最大刻度为12、超过12就变为1了(这个很重要)
沿用自计算机就出现了补码这一概念。
ok?我知道你还是很懵逼,接下来用一个例子就明白了。
如:
+3的原码可以表示为:00000011
+3的补码可以表示为:00000011
-3的原码可以表示为:10000011(注:计算机中无此表示、是人为设定)
那-3的补码怎么表示呢?
观察到,上述+3是采用8位二进制来表示对,不考虑符号位最大值可为256、当超过后会舍去超出部分,即:257会变成 00000001
所以依据钟表得到的启示、256就代表12、+3(00000011)就代表顺时针 3 圈、那-3顺理成章就应该是逆时针9圈。反应在以 256为循环的8位二进制中就变成 253(11111101)可表示-3.
因为最前面一位是符号位所以不用担心+256与-3的二进制相同(因为有符号的8位二进制正整数最大只能表示+127、想表示更多就只能变长(16位等等))
反思:为什么不用1000 0001表示-1?
因为在-127至-1区间、-1才是最大值,这样使用补码(1111 1111)来表示-1正好也表明-1是负数中的最大值。而(10000001)则用来表示最小值-127正好符合数学规律
首先、正数的补码与原码数值相同。
其次、以 -3 为例,有两种定义方法
1、将 +3 的原码表示,包括符号位在内各位取反,再在最低位上加 1
例:
00000011(+3原码)
=11111100 + 1
=11111101
2、将 -3 的原码表示、不包括符号位各位取反,再在最低位上加 1
例:
10000011(-3原码)
=11111100 + 1
=11111101
如果为正数,则与原码相同,如:+3的反码为:00000011
如果为负数、则是取原码的绝对值,然后按位取反(包括符号位),如:
-3 的反码:
-3 的原码:10000011
取绝对值:00000011
按位取反:11111100
负数转换为二进制的补码,即代表负数的十进制转换为了二进制数。
那么二进制表示的补码又可以通过三位表示一位的方法转换为八进制(符号位也进行计算),四位表示一位转换为16进制。
例:
-10 变为 有符号的二进制为:
10001010(此时为原码)
那么通过上面两种原码转换为补码的方法转换成补码:
11110101 + 1
=11110110(这个就是 -10 的二进制表示)
额,二进制转换为十进制就是逆转步骤。
以 -10 为例,先转换为二进制:11110110
然后三位为一位转换为八进制:011 110 110
= 366(八进制)
然后四位为一位转换为十六进制:1111 0110
= F6(十六进制)