在介绍设计位操作符之前我门先要了解数据在计算机的存储形式,上一篇文章我们详细介绍了进制转换,有了进制转换的知识就为我们下面的学习打下了基础。如果还不了解进制转换可以去看上一篇文章:传送门。
在上一篇文章中我们介绍了计算机的底层实际上就是电路,而电路只有高电平和低电平两种状态这就与二进制相似只有0和1这两种状态。这时可能有人问计算机是怎么存储数据的呢?比如在我们写代码的时候我们通常会定义一个变量然后给它赋值,那这个值是怎样存储的呢?
首先来介绍一下什么是原码,反码,补码:
1. 原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
2. 反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
3. 补码:反码+1就得到补码。
整数的2进制表示方法有三种,即原码、反码和补码 有符号整数的三种表示方法均有符号位和数值位两部分,2进制序列中,最高位的1位是被当做符号 位,剩余的都是数值位。 符号位都是⽤0表⽰“正”,⽤1表⽰“负”。一个整型数是占4个字节 一个字节占8比特位 所以是由32位二进制来构成 举个例子:
而整数又分为有符号整数和无符号整数这两种,而有符号数又分为正整数和负整数这两种。
- 正整数的原、反、补码都相同。
- 负整数的三种表方法各不相同。
-
负整数取反加一为补码 补码取反加一为原码。
我们来看一个简单的运算:
#include<stdio.h>
int main()
{
int a = 10;
int b = -5;
//10的原码00000000000000000000000000001010
//因为10为整数 原码=反码=补码
//-5的原码10000000000000000000000000000101
//-5的反码11111111111111111111111111111010
//-5的补码11111111111111111111111111111011
int c=a+b;
//a+b 是补码运算
//10的补码 00000000000000000000000000001010
//-5的补码 11111111111111111111111111111011
//相加之后的补码:100000000000000000000000000000101 最左边多出的一位将丢弃掉所以符号位为0是正整数 原反补都相同,直接读出101对应的值是5
printf("%d",c);
return 0;
}
由此我们可以总结:
但是数据存放内存中其实存放的是补码这是为什么呢?
在计算机系统中,数值⼀律⽤补码来表⽰和存储。原因在于,使⽤补码,可以将符号位和数值域统⼀ 处理;同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算 过程是相同的,不需要额外的硬件电路。