整型在内存中的存储方式
整型数据的二进制表现形式———原码、反码、补码
当整型是有符号整型时,这三种表现方法均有符号位和数值位两部分。
符号位 0 表示正
符号位1 表示负
正整数的原、反、补码相同
整型数据的存放方式
对于整型来说:数据存放内存中存放的是补码。
原因:
1.使用补码,可以统一处理符号位和数值域
2.加法和减法可以统一处理(cpu只有加法器),此外,原码和补码相互转换,其运算过程相同,不需要额外的硬件电路
整型数据的存放方式
对于整型来说:数据存放内存中存放的是补码。
对于使用补码存储的原因:
原因:
1.使用补码,可以统一处理符号位和数值域
2.加法和减法可以统一处理(cpu只有加法器),此外,原码和补码相互转换,其运算过程相同,不需要额外的硬件电路
int main()
{
int num = 10; //创建了一个整型变量,这时向内存申请大小为4个字节的空间进行存储
return 0;
}
10是正整数,所以其原,反,补码相同
00000000000000000000000000001010 -- 原码
00000000000000000000000000001010 -- 反码
00000000000000000000000000001010 -- 补码
再举-1的例子
10000000 00000000 00000000 00000001 -- 原码
11111111 11111111 11111111 11111110 -- 反码 //符号位不变,其余全部取反,符号位是第一位
11111111 11111111 11111111 11111111 -- 补码 //反码的二进制位加一就是补码
接着解释原因一:
当用原码进行计算的时候,计算结果是错误的
计算 1 - 1
相当于 1 + (-1)
00000000 00000000 00000000 00000001 -- 1的原码
10000000 00000000 00000000 00000000 -- -1 的原码
原码相加
10000000 00000000 00000000 00000010 ---- 其大小为 -2
与实际结果不符
用补码进行计算 1 + (-1)
00000000 00000000 00000000 00000001 -- 1的补码
11111111 11111111 11111111 11111111 -- -1 的补码
将两数的补码相加
00000000 00000000 00000000 00000000 --- 结果为0 符合实际结果
从上述情况可见,用补码计算统一了符号位和数值位 ,非常方便。
解释原因二:
原码到补码 和 补码到原码 都可以用取反 +1得到
如图
我们用 -1 来举例子
首先是最常见的情况
从原码变到补码
原码先取反再+1得到补码
10000000 00000000 00000000 00000001 --- 原码
11111111 11111111 11111111 11111110 ---- 反码 (原码取反)
11111111 11111111 11111111 11111111 ---- 补码 (反码+1)
然后是从补码变到原码
11111111 11111111 11111111 11111111 --- 补码
10000000 00000000 00000000 00000000 ---- 补码取反
10000000 00000000 00000000 00000001 --- 补码取反后+1 得到的就是 -1 的原码
所以从原码变到补码 和 从 补码变到原码 可以用相同的步骤完成,即运算过程相同
上图中 从补码-1再取反的运算过程其实就是原本的原码变到补码的逆运算。所以这里我们不再展开描述