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;

C语言中超出范围的数据的计算方法_第1张图片

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

例2、unsigned char b = 300;

C语言中超出范围的数据的计算方法_第2张图片

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

(2)技巧:

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

C语言中超出范围的数据的计算方法_第3张图片

你可能感兴趣的:(C/C++)