c语⾔两个字节范围,C语⾔整形数值范围问题两个负数的补码相加
有符号⼆进制数的表⽰是这样的:如果计算机的字长为n位,n位⼆进制数的最⾼位为符号位。其余n-1位为数值位,采⽤补码表⽰法时,可表⽰的数X的范围是 -2的(n-1)次幂 <= X <= 2的(n-1)次幂-1。如果字长是16位,补码表⽰的范围就是 -2的15次幂 <= X <= 2的15次幂-1,也即可表⽰的范围是-32768到32767。
计算机中⼆进制表⽰有原码、反码、补码表⽰。
原码是指将最⾼位作为符号位(0表⽰正,1表⽰负),其它数字位代表数值本⾝的绝对值的数字表⽰⽅式。
反码表⽰规则为:如果是正数,则表⽰⽅法和原码⼀样;如果是负数,则保留符号位1,然后将这个数字的原码按照每位取反,则得到这个数字的反码表⽰形式。
补码是计算机表⽰数据的⼀般⽅式,其规则为:如果是正数,则表⽰⽅法和原码⼀样;如果是负数,则将数字的反码加上1(相当于将原码数值位取反然后在最低位加1)。
所以正数的原码、反码、补码是相同的,32767⼆进制原码表⽰是0 111 1111 1111 1111,所以反码、补码表⽰都是0 111 1111 1111 1111;
由原码定义可知⼗进制负数-32768在16位计算机中是表⽰不出来的,1111 1111 1111 1111表⽰的是-32767,
但我们知道32768的原码是1 000 0000 0000 0000,其反码是0 111 1111 1111 1111,补码是1 000 0000 0000 0000,由补码定义可知恰好表⽰-32768。
两个有符号数进⾏加减运算时,如果运算结果超过可表⽰的有符号数的范围时,就会发⽣溢出,使计算机结果出错。很显然,溢出只能出现在两个同号数相加或两个异号数相减的情况。所以两正数相加,结果超出了范围,形式上变成了负数;两负数相加,结果超出了范围,形式上变成了正数(减法其实就是两个负数相加)。
-1⽤补码表⽰是1111 1111 1111 1111,即1000 0000 0000 0000 + 1111 1111 1111 1111时最⾼位有进位输出时,发⽣了溢出,形成了0111 1111 1111 1111,这就是有符号⼗进制数32767的⼆进制表⽰法,结果当然是32767了。
。
全部
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论