计算机原码、反码、补码、位移码,学习总结:
结合理论与实践记录下来.....
操作规则:
A、负数变二进制
原码,取反值,再加上1。
B、负数二进制变回实际值(由第一位确定是否为负数)
整体减1,再取反,再乘以-1.
eg:
//从十六进制到负数 0xFFFFFFFa ===>> 6
//整体减1,再取反,再乘以-1.
//1111 1010 --> 1111 1001 --> 0000 0110 --> -6
--------------------------------------------------------------------
///原码,加上1,再取反值。-6 ===>> 0xFFFFFFFa
//从负数到十六进制
//0000 0110 --> 0000 0111 --> 1111 1000 --> 0xFFFFFFFa
-6 补码
00000110
11111001
+ 1
--------
11111010
-10 补码
00001010
11110101
+ 1
--------
11110110
32+ 1 + 2+ 4 + 8
////////////////
-15 补码
0000 1111
1111 0000
+ 1
---------
1111 0001 字节
FFFFFFF1 双字节
////////////////
-1 补码
00000001
11111110
+ 1
--------
11111111
FFFFFFFF
从FFFFFFF1找出实际值,首先拿到最后两位
11110001
- 1
--------
11110000
00001111
--------
15
* -1
---------
-15
计算机是以补码的形式表示数值型数据的。
正数的原码、反码、补码都是一样的。
负数的原码和和它的绝对值所对应的原码相同,简单的说就是绝对值相同的数原码相同;
反码就是再逐个取反,补码就是在这个反码的基础上再次加1,即就是计算机存储形式补码。
其实反码、补码的提出就是针对负数的,跟正数屁关系没有。
也许只是为了统一一下说法“计算机都是以补码的形式表示数据的”,
不然就得说正数是用原码表示,负数时用补码表示。
补码。负数在计算机中的表示步骤:原码——反码(符号位不变)——补码(加1)。
由补码计算出负数真值的方法有两种。
一是,补码减1——取反(符号位不变)——原码;二是,补码——取反后加1——原码。所有的取反都不涉及符号位。
正数就是按照实际计算;
负数就是按照位置位取反,再加1,做进位计算。
总结一下
计算机储存有符号的整数时,是用该整数的补码进行储存的,
0的原码、补码都是0,正数的原码、补码可以特殊理解为相同,负数的补码是它的反码加1。
对于负数二进制回到十进制刚好使用相反的计算法则:
整体减1,再取反,再乘以-1.
十进制 → 二进制 (怎么算?要是不知道看计算机基础的书去)
47 → 101111
有符号的整数 原码 反码 补码
47 00101111 00101111 00101111(正数补码和原码、反码相同,不能从字面理解。计算机保存形式00101111)
-47 10101111 11010000 11010001(负数补码是在反码上加1,计算机保存形式就是补码11010001)
负数原码:
符号位1 + 绝对值的本身
举例: -7的原码: 10000111 +7的原码: 00000111
+0 的原码:00000000 -0的原码:10000000
+0的反码: 00000000 -0的反码:11111111
& 与。 全1为1, 有0为0。 任何数与0与都等于0。
| 或。 有1为1, 全0为0。 任何数与0或都等于原值。
~ 非。 逐位取反
^ 异或。 相同为0,相异为1。 任何数与0异或都等于原值。