为什么会输出结果会溢出? 浮点数运算结果会溢出吗
为什么使用二进制计算的时候会出现溢出现象?
使用二进制计算的时候会出现溢出现象,是因为计算机都有它的上限和下限,太大的数值和太小的数值都是无法显示出来的。
计算机中用补码来表示和存储数值,而在进行数值的算术运算时由于机器字长的限制往往会出现补码溢出,导致计算结果错误。
针对这个问题,提出了一种根据溢出结果得到正确结果的计算方法:
1. 两个正数相加溢出时,将错误解加上2~(n+1)即为正确解;
2. 两个负数相加溢出时,将错误解减去2~(n+1)即为正确解。
补码运算为什么会溢出
运算的结果大于数值设备所能表示数的范围,就会产生溢出。
如何判断补码溢出:
可以通过最高位与次高位进位来判断:若最高数值位向符号位的进位值与符号位产生的进位输出值不相同,则表明加减运算产生了溢出。
溢出现象应当作一种故障来处理,因为它使结果数发生错误。异号两数相加时,实际是两数的绝对值相减,不可能产生溢出,但有可能出现正常进位;同号两数相加时,实际上是两数的绝对值相加,既可能产生溢出,也可能出现正常进位。 由于补码运算存在符号位进位自然丢失而运算结果正确的问题,因此,应区分补码的溢出与正常进位。
补码溢出详解:
128 =1000 0000,8位机器
[-128]原码 = 1000 0000发生了溢出,最高位表示符号位:0为正数,1为负数
[-128]反码 = 1111 1111除符号位外,各位取反
[-128]补码 = 1000 0000 反码的末位加1,不能影响符号位
c语言溢出问题
对于正数,反码,补码与原码相同。
对于负数,补码是原码的符号位不变,数值部分按位取反再加1。
short型数据是16位表示最高位是符号位,所以只有15位表示数值,15位000000000000000-111111111111111表示的范围是0-32767,又加上最高位的符号位(第16位),就可以表示-32768-32767 。unsigned short型数据是16位都用来表示数值,16位0000000000000000-1111111111111111表示的范围是0-65535。
计算机在进行计算时是用补数计算的,且如果溢出会进行丢位处理。如short型32767补码是0111111111111111 加1后为1000000000000000(注意最高位是符号位),1000000000000000正是-32768的补数。
而unsigned short型数据无符号65535为1111111111111111(16位),加1后为10000000000000000(17位)这时计算机判断溢出后丢弃第17位,变为0000000000000000就是0了^_^
关于整型数据的溢出问题???
100000000000000表示是负数,所以答案要减1再取反。
011111111111111 //-1
100000000000000 //取反
最后将这个数变成十进制,然后加上负号。