欢迎大家评论区中指正呀,谢谢大家啦
文章目录
- 前言:必备知识
- 一、原码、反码、补码
- 1、原码
- 2、反码
- 3、补码
- 二、取反 (单目操作符 ~ )
- 1、数值8
- 2、数值-8
- 三、负整数 的 原码、反码、补码
- 四、正整数 的 原码、反码、补码
前言:必备知识
强调点:1、内存中存储的是 补码,打印显示在电脑屏幕上的是 原码;
2、反码 = 补码 - 1
3、因为计算机中存储是以补码的方式存储,所以我们对一个数取反,要先对它的补码进行取反,然后再求取反后的原码,而不是直接对其原码进行取反。
反码 = 补码 - 1
4、正整数的原码 反码 补码 是一样的;
5、负整数:原码,反码->原码的最高位符号位不变,其余位取反,
补码->反码+1。
6、最高位为1,表示负整数;最高位为0,表示正整数
一、原码、反码、补码
1、原码
原码由二进制原数值部分和符号部分组成
+1010101的原码为01010101,-1010101的原码为11010101,
0:正,1:负
2、反码
正数:反码和原码相同,为符号位加上原数值。
+10010101的反码为010010101
负数:反码为符号位不变加上原数值按位取反。-10010101的反码为101101010
3、补码
正数:补码,原码,反码相同。+110011补码为0110011
负数:补码为符号位加上原数值按位取反后再在最低位加 1,即为反码加 1 。-110011补码为1001101
二、取反 (单目操作符 ~ )
‘~’:单目运算符,对一个数的二进制位 按位取反。
以 8 和 -8 为例:
1、数值8
int main()
{
int a = 8;
printf("%d ", ~a);
return 0; //输出结果:-9
}
数值 | 8 |
---|---|
原码 | 0000 0000 0000 1000 |
反码 | 0000 0000 0000 1000 |
补码 | 0000 0000 0000 1000 |
因为计算机中存储是以补码的方式存储,所以我们对一个数取反,要先对它的补码进行取反,然后再求取反后的原码,而不是直接对其原码进行取反。
补码取反(此时仍然是补码) | 1111 1111 1111 0111(单目运算符~,是对所有二进制位取反) |
---|---|
取反后的反码 | 1111 1111 1111 0110(反码 = 补码 - 1) |
取反后的原码 | 1000 0000 0000 1001 |
原码二进制转换为十进制为:-9
故 ~8 = -9
2、数值-8
int main()
{
int a = -8;
printf("%d ", ~a);
return 0; //输出结果为:7
}
数值 | -8 |
---|---|
原码 | 1000 0000 0000 1000 |
反码 | 1111 1111 1111 0111 |
补码 | 1111 1111 1111 1000 |
补码取反(此时仍然是补码) | 0000 0000 0000 0111 |
取反后的反码 | 0000 0000 0000 0110(反码 = 补码 - 1) |
取反后的原码 | 0000 0000 0000 0110 (正数,原码、反码相同) |
原码二进制转换为十进制为:7
故 ~(-8) = 7
三、负整数 的 原码、反码、补码
#include<>
int main()
{
int a = -1;
printf("%d ", ~a);
return 0; //输出结果:0
}
解释:
变量类型 int ,4个字节
-1:
原码:10000000 00000000 00000000 00000001
反码:111111111 111111111 111111111 111111110(符号位不变,其余取反)
补码:111111111 111111111 111111111 111111111 (反码 + 1)
代码中 ~ 是单目运算符:对一个数的二进制位 按位取反
内存中存储的是 补码,按位取反
得到:00000000 00000000 00000000 00000000,这是一个正整数(符号位为0),所以原码、反码、补码是相同的,所以结果为0。
补码取反(此时仍然是补码):00000000 00000000 00000000 00000000
取反后的反码:00000000 00000000 00000000 00000000
取反后的原码:00000000 00000000 00000000 00000000
原码二进制转换为十进制为:0
故 ~(-1) = 0
四、正整数 的 原码、反码、补码
#include<>
int main()
{
int a = 0;
printf("%d ", ~a);
return 0; //输出结果:-1
}
解释
0:
原码:00000000 00000000 00000000 00000000
反码:00000000 00000000 00000000 00000000
补码:00000000 00000000 00000000 00000000
因为有 ~ ,所有二进制位按位取反
补码取反(此时仍然是补码):11111111 11111111 11111111 11111111
取反后的反码:11111111 11111111 11111111 11111110 (反码 = 补码 - 1)
取反后的原码:10000000 00000000 00000000 00000001
原码二进制转换为十进制为:-1
故 ~0 = -1