首先这里我们先使用 ~ 位取反 来带入正题
int main()
{
int a = 0;
printf("%d",~a);
}
结果: -1
大家应该就比较好奇了 为什么是-1呢
位取反也就是 二进制位取反 首先会先把 0 转换成2进制 然后取反 就得到下面的结果
00000000 00000000 00000000 00000000
11111111 11111111 11111111 11111111
但是这也不等于-1呀 这里就要说到 整数在内存中存储的都是补码 正数的原码 补码 反码 都是一样的(规定)
那么我们把-1 转换成 二进制 来看一下 他的原码是多少 (原码就是直接转成二进制后的值)
10000000 00000000 00000000 00000001(原码)第一个1代表的是负值
11111111 11111111 11111111 11111110 (反码)就是相反的值 但是注意符号位不变 就是第一位
11111111 11111111 11111111 11111111(补码)正数的补码就是其本身 负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
所以前面取得 0的位取反 得到的11111111 11111111 11111111 11111111 存储到内存中 就是一个补码
当我们输出的时候 就会转换成原码的方式 进行输出 10000000 00000000 00000000 00000001 也就是 -1