关于计算机底层8位二进制数-128~127这个范围的研究问题
Posted Fire king
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于计算机底层8位二进制数-128~127这个范围的研究问题相关的知识,希望对你有一定的参考价值。
关于计算机底层8位二进制数-128~127这个范围的研究问题:
首先要明确:
1.计算机识别这8位是带符号的,也就是说这8位是有符号整数,即仅有7位是表示值的。
2.如果是人为计算的话,你也可以视为这8位是无符号整数,这样算的话就要跟模联系起来才能跟1中对应起来。
由于2理解可能有点难,我们先说难的:
假设现在是2点钟,请用手动拨动时针的方式将时间减4小时,你会怎么做? |
有两种方式:
逆时针将时针拨4小时
顺时针将时针拨8(12-4)小时
也就是说 n-a = n+b, 2-4=2+8这里的定义不是数学上严格意义的值,而是效果(达到时间减4小时这种效果)。
那么这个a和b究竟是什么关系呢?
a=12-b,这个12是个特殊的数字,在钟表系统中12就是极限,学术上定义位模,注意:不同的系统对于极限的定义可能有所不同,比如我们常见的数字系统:
80-10 和 80+90,前者位70,后者为170,找相似,忽略100,70=70,两者效果一样,我们脑中联系一下10、90、100和70、170、100之间的关系:10+90=100,170%100=70,再联系时钟案例,a=10,b=90,10=100-90,所以说100就是2位数的极限(99+1),也就是模。
总结:n-a = n+b 模=极限=a+b ( n+b)%模=n-a,两个相加等于模的数互为补数,即a和b互为补数。 |
根据上面公式10-30=10+70 80%100=-20
,显然这个公式不够完美,数据支撑性比较弱,不够健壮。
那么如何将n-a = n+b完美一下呢,首先,索性-20=80,也就是说我们可以使用80代表-20,同时可以关联到-20绝对值的补数就正好是80,也就是说以后
用两位正整数表达两位负整数的规则:-(两位数的模-两位正整数) |
但是两位正整数既原意表示,又表示负数,到底去哪个呢?
为了解决这个问题,需要给这套规则划定一个范围,原来是0~99的正数,现在既然要用部分正数来代替负数了,那就要规定一个范围来使得一个数只代表一个含义,正好一人一半,0~49这个区间就代表正数,50~99的区间就用来代表各自补数的负值,例:98就代表-2,这和上面两位正整数表达两位负整数的规则完美契合。0~49和50~99
分别对应0~49和-50~-1
,以0和-1中间为界,接近1/2正数和1/2负数对称。
根据上面的理论:8位是无符号整数,转成人看的10进制共256位(包括0),一半0~127,另一半128~255表示-(256-255)=-1~-(256-128)=-128,8位是无符号整数的极限就是8位全1+1。
再看1的分析:
计算机的世界:
最小00000000(0),最大01111111(127),是不是跟上面一半0~127对应了,并且这里将最高位作符号位后也是正数一半,负数一半。同时最大10000001(-1),为啥不是10000000(因为-0也是0,0在正数那边表示过了,这里的10000000另作安排),最小11111111(-127),饿货,跟上面-(256-255)=-1~-(256-128)=-128(简化:-1~-128)不对应了,所以10000000就有了用处,作为一种约定:10000000代表10进制-128,同时作为补码。
因此:
计算机底层运算规则:
原码=》补码=》运算
打印到控制台 :补码=》原码(负数:-1除符号位按位取反)
demo:
Byte a = 127;
a++
System.out.println(a); //a=-128
计算机底层运算过程:
原码-》补码
01111111=》01111111
add 1
10000000(此时10000000是补码,上面讨论过补码10000000代表10进制-128)
补码-》原码
10000010-1=10000001
10000001=》11111110
Byte a = -127;
a++
System.out.println(a); //a=-126
计算机底层运算过程:
原码-》补码
11111111=》10000001
add 1
10000010
补码-》原码
10000010-1=10000001
10000001=》11111110
以上是关于关于计算机底层8位二进制数-128~127这个范围的研究问题的主要内容,如果未能解决你的问题,请参考以下文章
Java中,为什么byte类型的取值范围为-128~127?