C语言超出类型数值范围的表示方法

       (1)对于正数超出表示范围的表示结果

        对于一个有N位(比如char 8位,int 32位)的数字类型,我们要表示数字number。首先,我们确定number是否超出类型的表示范围。如果超出类型的表示范围,则remainder=number%2**N。如果没有超出类型的表示范围,remainder=number 。 如果要unsigned类型表示,并且remainder<2**N,则我们直接可以得到结果result = remainder。如果要用有符号类型表示,并且2**N>remainder>2**N/2-1,则result =remainder -  2**N(即该数的补码负数表示)。

        sample_1:
        shorts=100000;(等价于short s=(short)100000,但是short最多表示2**16=65536。我们执行100000%65536=34464,编译器对100000强制转化为short类型,截取最后16位的值)

        34464大于32767。如果用无符号的short类型存储34464,那是足够的(unsigned short的范围是0~65536=2**16)。但是,同样的16位的值,用有符号的short类型保存,就超出范围了,它表示的就是另外一个值。

       如果是有符号存储的话,则有remainder=34464,result=34464-2**16,所以result=-31072。

       sample_2:

       char c = 255.

       在这里,char是8位,最多表示-128~127,显然已经超出了表示范围。那我们的处理方式是result=255-2**8=-1。因此,补码表示是-1.

       (2)在计算机中的数值表示是补码形式。如果,我们遇到负数超出表示范围,或负数转换为无符号数的情况,可以考虑补码解决方案。

       eg_1:

       unsigned short b=-1;

       printf("%d",b);

       在这里我们得到的结果是65535。-1是int整型,其原码是10000000,00000000,00000000,00000001,反码表示是11111111,11111111,11111111,11111110,补码表示是11111111,11111111,11111111,11111111。unsigned short是16位表示,我们截取低16位(即后16位),因此b的输出结果是65535。

       eg_2:

       char t_c=-130;

       print ("%d",t_c);

       在这里,我们得到的结果是126。-130的补码表示是11111111,11111111,11111111,011111110。char字节是8位表示,我们截取后8位,因此得到的结果是126.

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值