作者:萍水相逢--莹 | 来源:互联网 | 2023-10-14 15:35
我们知道JAVA中byte是一个字节来进行存储的,即8位二进制数,可以表示的数字有256个即(0-255) 但计算机中需要表示正数和负数,那么负数在计算机中怎么表示呢?这里涉及一个
我们知道JAVA中byte是一个字节来进行存储的,即8位二进制数,可以表示的数字有256个即(0-255)
但计算机中需要表示正数和负数,那么负数在计算机中怎么表示呢?
这里涉及一个新的概念就是
模:
模 即n位m进制能表示的数字的个数,那么8位二进制数的模就是256
如果是两位10进制数呢,那就可以表示 0-99 这100个数,即模是100
补数:
范围在 1->模 之间的任意两个相加等于模的数互为补数
先贤们就用一个很巧妙的方式来表达了负数:即在(0-模)范围内一半的数字表示正数,一半的数字表示负数
0-127(十进制) 这128个数字表示byte中的 0-127
128-225(十进制)这128个数字表示byte中-128 到 -1
在计算机中存储的二进制表示如下:
数字和对应的二进制
128表示-128 | 255表示-1 |
1000 0000 | 1111 1111 |
上面的二进制即是大家熟知的补码(补数对应的二进制数即补码)
源码,反码,补码体系
正数补码是其二进制数本身
负数的补码是首先获得其绝对值原码,再首位变1后其余取反再加1;
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
可以参看:http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html
这和用模的概念获得数字在计算机中存储的二进制结果是一致的,
可以说后者(原码,反码,补码)是一种途径,而前者(一半用来表示正数,一半用来表示负数)是约定;