网站宣传模式,市场监督管理局12315,个人博客登录首页,佛山营销型网站建设1. 操作符的分类 2. 原码、反码、补码
整数的2进制表示方法有三种#xff0c;即原码、反码、补码
有符号整数的三种表示方法均有符号位和数值位两部分#xff0c;2进制序列中#xff0c;最高位的1位是被当做符号位其余都是数值位。
符号位都是用0表示“正”#xff0c;用…1. 操作符的分类 2. 原码、反码、补码
整数的2进制表示方法有三种即原码、反码、补码
有符号整数的三种表示方法均有符号位和数值位两部分2进制序列中最高位的1位是被当做符号位其余都是数值位。
符号位都是用0表示“正”用1表示“负”。
例分别写出1、-1的2进制
int a 1;
int b -1;
其中a、b都是整形变量是4个字节32bit位那么a、b的2进制为
a00000000000000000000000000000001
b10000000000000000000000000000001 正整数的原码、反码、补码都相同 负数的三种表示方法各有不同 原码直接将数值按照正负数形式翻译成2进制得到的就是原码。 反码将原码的符号位不变其他位依次按位取反就可以得到反码。 补码反码加1就可以得到补码。 补码得到原码也是可以使用取反加1的操作。 例分别写出-10的原码、反码、补码
原码10000000000000000000000000001010
反码11111111111111111111111111110101
补码11111111111111111111111111110110
对于整形来说数据存放内存中其实存放的是补码。
为什么呢 简化计算使用补码可以将符号位和数值位统一处理这样无论是正数还是负数都可以用同一套逻辑来进行加减运算。由于计算机的CPU只有加法器没有减法器通过补码可以将减法运算转换为加法运算从而简化了硬件设计。避免歧义补码的表示方法确保了0的编码只有一个不会出现两个不同的编码对应同一个数0的情况。这对于避免数据表示上的歧义非常重要。提高存储效率原码、反码和补码是二进制数的三种不同表示方法。原码是最直观的表示方法但它在表示负数时需要额外的符号位并且在进行运算时需要分别处理正负号。反码是对原码的改进它将负数的符号位保持不变数值位取反。而补码则是在反码的基础上加1它不仅解决了0的表示问题还可以通过补码直接进行加减运算无需额外的硬件电路。方便逻辑电路实现计算机由逻辑电路组成逻辑电路通常只有两种状态即开关的接通与断开刚好可以表示成‘1’和‘0’。因此计算机只存储二进制数据而补码作为一种二进制表示方法非常适合于计算机的逻辑电路实现。 3. 移位操作符移动的是二进制位 左移操作符 右移操作符
注移位操作符的操作数只能是整数。
3.1 左移操作符
左移操作符有一个乘以2的n次方的效果n为后面的数字
移位规则左边抛弃右边补0.
例1 上图中a的补码为
00000000000000000000000000000110
其中b a 1,那么在a的补码的基础上抛弃左边的1位然后在右边补上一个0可得b的补码
00000000000000000000000000001100
例2 a的补码为11111111111111111111111111111010
b得到的补码11111111111111111111111111110100 3.2 右移操作符
左移操作符有一个除以2的n次方的效果n为后面的数字
移位规则
1. 逻辑右移左边用0填充右边丢弃。
2. 算术右移左边用原值的符号位原值是正数就用0是负数就用1填充右边丢弃。
注是逻辑右移还是算术右移是取决于编译器的实现常见的编译器都是算术右移。
算术右移 a的补码为11111111111111111111111111111010
b得到的补码11111111111111111111111111111101 4. 位操作符、|、^、~ 1. 按位与 2. | 按位或 3. ^ 按位异或 4. ~ 按位取反 注它们的操作数必须是整数
4.1
运算规则
左右两个数的补码中有0就取0两个同时为1才取1
例 3的补码为 0000000000000000000000000000011
-5的补码为11111111111111111111111111111011
c得到的补码为0000000000000000000000000000011
4.2 |
运算规则
|左右两个数的补码中有1就取1两个同时为0才取0
例 3的补码为 0000000000000000000000000000011
-5的补码为11111111111111111111111111111011
c得到的补码为11111111111111111111111111111011
4.3 ^
运算规则
相同为0相异位1. 3的补码为 0000000000000000000000000000011
-5的补码为11111111111111111111111111111011
c得到的补码为11111111111111111111111111111000
例题不使用临时变量的情况下交换a和b的值
由^的运算规则我们可以知道当^两边的数相同时所得到的结果为0而0^aa所以我们利用这个规律我们就可以在不使用临时变量的情况下交换a和b的值如下图: 4.4 ~
运算结果为~右边的数1然后取相反数例如~1 -2~-1 0
运算规则
对~右边的数的2进制按位取反 0的2进制为 0000000000000000000000000000000
b得到的补码为11111111111111111111111111111111
5练习
练习1
编写代码实现求一个整数存储在内存中补码中1的个数。
法1
由的运算规则我们可以知道a11的式子成立时就说明a的补码最右边的数为1从这里可以知道依次将a的补码的32个数依次移动到最右边(这里可以使用右移操作符移动)然后统计有几个符合a11就可以求出这个整数存储在内存中补码中1的个数。
以13为例求13在内存中补码中1的个数
13的补码 00000000000000000000000000001101 1的补码 00000000000000000000000000000001 法2
int main()
{int n 0;scanf(%d, n);int count 0;while (n){n n (n - 1);count;}printf(%d\n, count);return 0;
}
思考题
如何判断一个数是否是2的次方数
2的n次方数的二进制中只有1个1而式子nn-1就可以直接把这个1去掉了所以要想判断一个数是否是2的次方数只需要判断等式nn-1 0是否成立就可以了。
练习2
二进制位置1或者置0
编码代码将13二进制序列的第5位修改为1然后再改为0 13的2进制序列 00000000000000000000000000001101 将5位置为1后 00000000000000000000000000011101 将5位置为0后 00000000000000000000000000001101 int main()
{int a 13;//将5位置为1a | 1 4;printf(%d\n, a);//将5位置为0a ~(1 4);printf(%d\n, a);return 0;
}
6. 逗号表达式 exp1exp2exp3....expN 用逗号隔开的表达式就是逗号表达式。
逗号表达式从左向右依次执行整个表达式的结果是最后一个表达式的结果。
例1计算下列表达式c中的结果
int main(){int a 1, b 2;int c (a b, a b 10, a, b a 1);printf(%d\n, c);return 0;
}
表达式的运行过程为ab为假但不影响表达式的结果 - ab 10 - 12 - b a 1 13
因为最终决定表示结果的是表达式b a 1所以最终的结果为13 例2 逗号表达式在if语句中真正起判断作用的是最后一个表达式 。
7. 下标访问[ ]、函数调用
7.1 [ ] 下标引用操作符
操作数一个数组名 一个索引值下标
7.2 函数调用操作符
接受一个或多个操作数第一个操作数是函数名剩下的操作数就是传给函数的参数。
#includestdio.h
int main()
{printf(hello world!\n);//( )函数调用操作符return 0;
}