C语言学习之路一

一、在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



















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值