关于计算机底层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

Java中,为什么byte类型的取值范围为-128~127?

JAVA中byte类型的介绍。 谢谢

关于JAVA中Byte类型的取值范围的推论(*零为正数,-128在计算机中的表示方法...)

关于有符号整数的补码编码的一点经验

char类型的取值范围是