C语言整形数值范围问题
发布网友
发布时间:2024-09-30 16:59
我来回答
共1个回答
热心网友
时间:2024-10-21 12:15
有符号二进制数的表示方法由计算机字长决定。字长为n位时,最高位为符号位,其余n-1位表示数值。补码表示法下,数值范围是 -2^(n-1) ≤ X ≤ 2^(n-1)-1。例如,16位计算机中数值范围为 -32768到32767。
计算机使用原码、反码和补码表示数据。原码以最高位作为符号位(0表示正,1表示负),其他位表示数值的绝对值。反码规则:正数原码表示,负数将符号位保留1,其他位取反。补码是计算机数据表示的通用方式,正数表示与原码相同,负数是反码加1(原码数值位取反,最低位加1)。
正数原码、反码和补码相同。32767的二进制原码是0 111 1111 1111 1111,因此反码、补码表示也是如此。负数-32768在16位计算机中表示不全,但其原码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。