在计算机中整数都是以二进制形式存储的,二进制数包括符号位和数值位,正数的符号位是0,负数的符号位是1。
对于正数的数值位:正数的原反补相同(无符号整型当作正数对待)
例如,12
原码 00001100
反码 00001100
补码 00001100
对于负数的数值位:
负数的反码是在原码的基础上,符号位不变,其他位按位取反得到的
负数的补码是在反码的基础上+1得到的
例如,-12
如何将补码转化为原码?
方法一:
得到补码的逆过程:
将补码-1,之后除符号位按位取反
方法二:
再求一次补码:
将补码当作原码,将其转化得来的补码就是我们要求的原码
在计算机中数字都是以补码的形式存储的,在使用移位操作符、位操作符等其它与之相关的操作符时,都是对数字的补码进行操作,在最后将数字输出是又会转为原码输出。
例如,如何理解 ~(-5)
这里为了直观简洁只用8位二进制数表示,实际上是32位二进制数
真实结果是 01111111111111111111111111111111
又如,我们知道unsigned int是无符号整型,如果将一个负数赋给无符号整型,最后以无符号的类型输出,那么它的结果是什么呢?
所以n将是一个特别大的数。