目录
1.对于原码反码补码的详解
对于他们三者直接的转化如下:
原码就是我们根据数字可以写出来的二进制数字
(1).原码就是我们根据数字可以写出来的二进制数字
(2).原码转换为反码:符号位不变,数值位分别“按位取反”
(3).反码转换为原码也是一样:符号位不变,数值位分别“按位取反”
(4).原码转换为补码:符号位不变,数值位按位取反,末位再加1
(5).补码转换为原码:符号位不变,数值位按位取反,末位再加1
注:在计算机中不管是正数还是负数存储的都是这个数的补码
但是负数原码反码补码各不相同,而正数的原码反码补码是相同的
任何对于数字的操作都是对数的补码进行操作
正数:
1的原码(00000000 00000000 00000000 00000001)
5的原码(00000000 00000000 00000000 00000101)
1和5在计算机中存储的是他们的补码,只是原码与补码长得一样而已
负数:
-1的原码(10000000 00000000 00000000 00000001)最高位为符号位1为负0为正
-1的反码(11111111 11111111 11111111 111111110)
-1的补码(11111111 11111111 11111111 111111111)
-1在计算机中存储的即是-1的补码
2.操作符“~”
int main()
{
int a = 0;
printf("%d", ~a);
return 0;
}
运行结果
注:操作符“~” 按(二进制)位取法 把所有二进制位中的数字,1变成0,0变成1
一个整数的二进制表示有三种:
负数的计算:
-1:
10000000000000000000000000000001(原码)(ps:最高位表示符号)
11111111111111111111111111111110(反码)(除了符号位,其他位与原码相反)
11111111111111111111111111111111(补码)(ps:反码+1)
正整数:
求原码即可,原码,反码,补码相同。
上面的代码中
例:整数a=0:
二进制:00000000000000000000000000000000
~a :11111111111111111111111111111111
因为整数在内存中存储的是补码,在内存中计算,所以
11111111111111111111111111111111
这是补码
%d显示的是原码,需要反推最后显示
10000000000000000000000000000001=-1
例:整数a=-1
10000000 00000000 00000000 00000001 -1的原码
11111111 11111111 11111111 11111110 -1的反码
11111111 11111111 11111111 11111111 -1的补码(计算机中存储的数据)
00000000 00000000 00000000 00000000 ~-1
00000000 00000000 00000000 00000000 这是一个正数所以原码补码反码都一样