一、了解数据宽度
-
计算机中存储的数据最终都是二进制存储的,计算机只认识1和0,但是不是一下子全部存进去的,而是分成很多的容器,每个容器都有最大容量,比如有的可以装4个二进制数,有的可以装8个二进制数。即在计算机中,由于受硬件的制约,数据都是有长度限制的(我们称为数据宽度)
-
如果要存储的数超过了容器的数据宽度计算机怎么处理呢?直接将高位多出来的位丢弃!
比如一个容器的数据宽度为4位,那么如果我现在存一个数16,化为二进制为10000,由于只能存4位,那么进位的多出来的位会被丢弃,最终读到的是0000,即0
二、数据宽度详解
以前我们只是记忆过如果计算机中某容器只能存储4位二进制数,那么如果存无符号数,那四个位都可以存数,则一共十六种情况,0000到1111(24);如果存储有符号数,则最高位要被当做符号位,如果为0则为正数,如果为1则为负数,所以此时只能后三位用来表示数据值,则有正000到111(23)和负000到111。但是计算机真的认识有没有符号吗???而且我们平时说的反码,原码,补码,计算机不知道,这只是人们总结出来的规律
1)4位宽度表示:假设计算机只能存储4位2进制数
实际上计算机中没有4位容器,我们只是为了引入方便理解,汇编中最小的容器数据宽度是8位的,即一个字节
-
假设计算机只能存储4位二进制数:一共有16种数可以存:换成十六进制刚好是0到F
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0 1 2 3 4 5 6 7 8 9 A B C D E F
-
无符号数:至于这块容器到底存有符号还是无符号数,是我们定义的。计算机最终只认识0、1,它不管哪个正负。所以现在如下图所示,从圆的右下方开始存数据,存无符号数。依次存0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F。如果再比F大的数则会变成0!此时一共可以存16种数
-
有符号数:由于只能存4位二进制数,现在我们又有存负数的需求,怎么办呢?公平起见,分两半,约定好一半存正数,一半存负数,所以此时0到7是正数,8到F是负数。因为数字只能用4位来存储,又要表示负数又要表示正数,所以干脆分一半。如果换成二进制就会发现,0到7最高位全是0;8到F最高位全是1。而且此时F为最大的负数,怎么推断的的呢?因为如果比F再大1的数就变成了0:1111+1=10000,只能存4位,多出来的位,计算机会丢弃,则计算机会当做0000,即0。所以F是最大的负数-1。那么对应的E就是-2,D就是-3。(这里可以用补码去理解)
-
有符号数二进制1111表示最大的负数-1,现在用补码转原码的知识(计算机中的数都是二进制补码的形式存储的):将有符号数1111(补码)化成十进制是多少:先除符号位取反码1000,再末位+1,1001。最高位为符号位,后面001表示数值,则算出来就是-1(原码)
2)8位宽度表示:假设计算机只能存储8位2进制数
-
假设现在4位不够表示我要存的数了,我换一个大一点的容器,存储数据的范围为0x00到0xFF,即数据宽度为8位,那么此时此容器如果用来存无符号数,则可从0x00一直存到0xFF,一共28=256种数;如果存有符号数,则还是切一半,00到7F是正数,80到FF为负数,化成二进制可以发现规律,80到FF的最高位都是1,即最高位为1的表示负数。正数同理可得。0xFF为最大的负数-1,0x80为最小的负数-128。
3)16位宽度表示:假设计算机只能存储16位2进制数
-
16位数据宽度容器存储无符号数范围是从0到FFFF
-
存储有符号数从0到7FFF表示正数,从8000到FFFF表示负数
4)32位宽度表示:假设计算机只能存储32位2进制数
目前计算机中最常见的也是这个数据宽度的容器
-
32位数据宽度容器存储无符号数范围是从0到FFFFFFFF
-
存储有符号数从0到7FFFFFFF表示正数,从80000000到FFFFFFFF表示负数
三、几个重要的计量单位
BYTE | 字节 | 8bit | 1字节 |
---|---|---|---|
WORD | 字 | 16bit | 2字节 |
DWORD | 双字 | 32bit | 4字节 |