一、在32位pc机器上,unsigned int 型取值范围是多少,int型取值范围是多少?
比较容易的是无符号的位:unsigned int 型
就以8位机为例,最小是00000000,最大是11111111,范围是0-2^8-1,共可代表256个数
同样以8位机为例,有符号的时候该如何计算?
有符号位最高位应该为符号位,这样的话实际上我们就算7位
正数最大值: 最高位为0(符号位),表示正数,其余位为1表示正数的最大数 ----> 0 1111111=2^7 -1=127,表示数的范围:00000000~01111111(0~127)
负数最小值: 最高位为1(符号位),表示负数,其余位为1表示负数的最小值 -----> 1 1111111=-(2^7-1)=-127,表示数的范围是10000000~11111111(-127~ -0)
理论上应该是以上分析的那样
但是在计算机中,所有的数都是以该数补码形式存在的,对于正数而言,原码、补码值是一致的,而对于负数而言,先对该数进行取反然后再加1,即可得到该负数的补码
按照这种学习思路,
正数:
原码 反码补码
00000000 00000000 00000000
00000001 00000001 00000001
负数:
原码 反码 补码
10000000 11111111 (1)00000000反码后加1,第9位为1,会被剔除,因为这时8位机
10000001 11111110 11111111
所以实际上正数0和负数0在计算机中表示的是用的同一个编码,这样8位机本可以表示的是256个数,但现在变成了(0~127)和(-127~0),就变成了255个数,因为正0和负0在计算机中补码表示是重复了,因为在计算机界就规定将10000000(-0)表示成最小的数-128.
二、为什么要引入补码?
为什么在计算机中要把一个数换成补码形式存在,这是因为如果是原码形式的数在进行正数和负数的加减运算时会出错,如下
1-2=-1;
用原码做的时候 用补码做的时候
0000 0001(原)0000 0001(补)
+ 1000 0010(原) +1111 1110(补)
-------------------------- ---------------------------------
1000 0011(原) 1111 1111(补)
其值等于-3,运算错误 1111 1111(补),补码的补码等于原码所以得其原码是 1000 0001=-1,值正确
所以在计算机中用补码表示一个数时,可以进行带符号的运算
三、
在一个32位机中,定义一个数int num=914 (11 1001 0010)
强转成带符号char类的数据保留后八位 1001 0010,这个截取操作在计算机中操作,原本的正数会变成负数,因为符号位为1(第八位为符号位,为1表示负数)
所以其10010010原码为11101110=-110
如果强制转换成unsigned char类型的数据,1001 0010原码为1001 0010=146