c语言的整形整形输入问题

c语言的整形整形数值范围问题

 短整形如果是2字节就是16位,在有符号的情况下正数最高是11 1111,负数是11 1111为什么换算成十进制最高位就变成了32767,负数的变成了-327682进制中的-32768不昰应该是0
 短整形如果是2字节,就是16位在有符号的情况下,正数最高是11 1111负数是11 1111,为什么换算成十进制最高位就变成了32767负数的变成了-32768,2進制中的-32768不是应该是00 0000么在加上符号位就成了17位了,这个数值范围究竟是怎么分配的
 
  •  有符号二进制数的表示是这样的:如果计算机的字长為n位n位二进制数的最高位为符号位。其余n-1位为数值位采用补码表示法时,可表示的数X的范围是 -2的(n-1)次幂 
    计算机中二进制表示有原码、反碼、补码表示
    原码是指将最高位作为符号位(0表示正,1表示负)其它数字位代表数值本身的绝对值的数字表示方式。
    反码表示规则为:如果是正数则表示方法和原码一样;如果是负数,则保留符号位1然后将这个数字的原码按照每位取反,则得到这个数字的反码表示形式
    补码是计算机表示数据的一般方式,其规则为:如果是正数则表示方法和原码一样;如果是负数,则将数字的反码加上1(相当于将原码數值位取反然后在最低位加1) 所以正数的原码、反码、补码是相同的,32767二进制原码表示是0 111 11所以反码、补码表示都是0 111 11; 由原码定义可知十進制负数-32768在16位计算机中是表示不出来的,11 1111表示的是-32767但我们知道32768的原码是1 000 00,其反码是0 111 11,补码是1 000 00,由补码定义可知恰好表示-32768
    两个有符号数进行加减运算时,如果运算结果超过可表示的有符号数的范围时就会发生溢出,使计算机结果出错很显然,溢出只能出现在两个同号数相加或两个异号数相减的情况所以两正数相加,结果超出了范围形式上变成了负数;两负数相加,结果超出了范围形式上变成了正数(減法其实就是两个负数相加)。
    -1用补码表示是11 1111即00 0000 + 11 1111时最高位有进位输出时,发生了溢出形成了11 1111,这就是有符号十进制数32767的二进制表示法結果当然是32767了。
  • 原因是实际存储的时候都是采用补码存储的你转换成原码就可以清楚这个范围了。
    全部
  • c语言的整形数的取值范围就是-32768…………32767
    全部

我要回帖

更多关于 c语言的整形 的文章

 

随机推荐