真值与机器值
真值很好理解,就是十进制的数字前面再加上正负号,这是人类可以简单识别的数字,比如0、±16、±1084、±10.34、±100.453等,而正数前面的+符号可以省略。机器值从字面理解就是机器( 计算机 )识别的值,实际上也确实是这个意思。
计算机中通过高低电平表示1或者0,这样就可以表示一个二进制的数值。一个1或者0表示的数值位称为一个bit,而计算机中存储和传输数据的最小单位是一个字节(by te )也就是8个bit,所以说计算机所有计算本质上都是基于二进制。
由于很多时候一个数据需要使用2个或者2个以上的字节表示,那么这种数据无论是存储还是传输的时候都会有一个顺序的问题,也就是大小端对齐(字节序)问题。在存储时高位字节在前为大端对齐,反之为小端对齐。在数据传输时先传输高位字节为大端字节序,反之为小端字节序。目前绝大多数平台内部都是小端对齐的方式存储数据,而大多数通信协议却都是用大端字节序传输数据,所以这一点值得注意一下。
符号位与数值位
计算机中使用二进制存储传输和计算数值,但是不能只有数值,计算的时候还得有正负之分。在计算机中使用最高bit位的数值来表示正负号,这个bit位称作符号位。
计算机中符号位的值为0表示这个数为正数,符号位值为1表示这个树为负数。由于符号位表示符号所以其不表示具体的值,除开符号位剩余的bit位用来表示数值也就是数值位。比如1个字节的整数00000001,其中最高bit(最左边)位的0为符号位,表示这个数为正数,数值位为1,所以其真值为1。同理2个字节的整数00000000_0000001,其真值也是1。
原码、反码和补码
注:int8为8bit位整数占用1byte,int16为16bit位整数占用2byte。
被乘数的第1个bit位值为0,将被乘数乘以0然后左移1位得到:00000000;
被乘数的第4个bit位值为0,将被乘数乘以0然后左移4位得到;00000000;
被乘数的第5个bit位值为0,将被乘数乘以0然后左移5位得到;00000000;
被乘数的第6个bit位值为0,将被乘数乘以0然后左移6位得到;00000000;
被乘数的第7个bit位值为0,将被乘数乘以0然后左移7位得到;00000000;
至于除法则是使用交替加减法的方式,本文只是对计算原理做一下扩展,这里不再继续深入做介绍,如果有想了解的可以自行上网查询。
通过上面的分析可以知道,使用补码可以将所有计算都转化为加法计算,这样可以让计算机底层对于整数计算变得简单,反码属于历史遗留,因为其存在±0的问题。