C语言中超出范围的数据的计算方法

	在C/C++语言中,数据可以分为无符号数据unsigned和有符号数据signed,如果不声明数据的类型,默认是有
符号的。数据在内存中都是以二进制补码的形式进行存储的。

1、原码、反码、补码

1、正数的原码、反码、补码都是其本身;负数的等于原码除符号位外全部按位取反,负数的补码等于负数的反码加1.
2、无符号数据全部都正数;有符号数据的最高位表示符号位,符号位为0表示正数,符号位为1表示负数。
3、可以由负数的原码求反码和补码,也可以由负数的补码来求原码。对负数的补码按照原码求补码的操作再次求补码
得到负数的原码。

2、超出范围数据的计算方法

(1)操作步骤:

1、我们将数据以补码的形式存放在内存中
2、判断赋值变量的类型:如果赋值变量是unsigned类型,则表示正数,正数的原码等于补码;如果赋值变量是
signed类型,则进一步对符号位进行判断。如果符号位为0,表示正数;如果符号位为1,表示负数,需要将补码
转换为原码的形式。

例:以unsigned char 和 signed char 类型的数据为例
例1、char a = 200;

在这里插入图片描述

运行结果分析:
1、200是一个正数,正数的原码和补码相等,将200以补码的形式存放咋内存中:1100 1000
2、赋值变量a默认是一个有符号的数,1100 1000 的最高位是1,表示负数。对负数的补码再次求补码,得到负数
的原码进行输出:1011 1000,即十进制的-56

例2、unsigned char b = 300;

在这里插入图片描述

运行结果分析:
1、300是一个正数,将其按补码的形式存放在内存中 1 0010 1100
2、赋值变量a是一个unsigned类型,表示一个正数。但是char占用一个字节,所以舍弃高位,去低八位得到如下:
0010 1100 ,将补码转换为原码相当于十进制的44 

(2)技巧:

1、口诀:超出范围的数据如果是正数,则减去256;超出范围的数据如果是负数,则加上256.
例:200-256 = -56; 300-256 = 44
2、画圆法:

在这里插入图片描述

  • 9
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值