整形在内存中的存储
整形在内存中以补码形式存储 复制代码
原因:
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码, 可以将符号位和数值域统一处理; 同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换, 其运算过程是相同的,不需要额外的硬件电路 复制代码
1 + (-1) 假设使用原码计算: 1的原码: 00000000 00000000 00000000 00000001 -1的原码: 10000000 00000000 00000000 00000001 ----------------------------------------- 10000000 00000000 00000000 00000010 ->-2 所以1+(-1) -2 //err 复制代码
1 + (-1) 假设使用补码计算 1的原码:00000000 00000000 00000000 00000001 1的补码:00000000 00000000 00000000 00000001 正数原反补相同 -1的原码:10000000 00000000 00000000 00000001 反码:11111111 11111111 11111111 11111110 补码:11111111 11111111 11111111 11111111 两个补码运算 00000000 00000000 00000000 00000001 + 11111111 11111111 11111111 11111111 ----------------------------------------- 1 00000000 00000000 00000000 00000000 计算出进位,有33位,但是只取32位->结果为0 复制代码
原码反码补码
已知补码求原码:
方法1:对补码A求补码B, 求出的补码B就是补码A的原码
方法2:
补码-1 ->反码
反码按位取反(符号位不变)->得到原码
例: 已知补码:11111111 11111111 11111111 11111111 求原码 11111111 11111111 11111111 11111111 方法1:对补码再求补码,把要求的补码当成原码,求出来的补码就是原码 11111111 11111111 11111111 11111111-原码 10000000 00000000 00000000 00000000-反码 10000000 00000000 00000000 00000001-补码 得出的该补码10000000 00000000 00000000 00000001,就是要求的11111111 11111111 11111111 11111111补码的原码->值为-1 复制代码
方法2: 补码 - 1 -> 反码 11111111 11111111 11111111 11111110 ->反码 反码按位取反(符号位不变) ->原码 10000000 00000000 00000000 00000001 ->原码 该原码的值为-1 复制代码