C++根据功能和用途将运算符分为算数运算符、位运算符、关系运算符和逻辑运算符等不同类型。四种不同运算符的优先级从大到小依次位算—位—关—逻。

一、算数运算符

1、加减乘除(+ - * /)

加减乘除位常识不在详谈,主要讲解一下在进行加减乘除是的数据类型转换。

1)、强制转换

(stort)32指定32为有符号短整型(2字节)、 (long)-32指定-32为有符号长整型(4字节)。数据类型应该和操作数的数值相符,否则将造成数据改变。若(flaot)32将32转为32.0还可以接受,(int)1.8将1.8转为1造成了数据丢失应尽量避免。强转还会造成数据溢出和丢失负号:(short)32769将32769变成-32767,(unsigned short)-1将-1变成65535(丢失负号)。思考为什么-1会变成65535呢?

2)、隐含转换

C++编译器将源程序编译成目标程序时,如果发现某个算术表达式含有不同数据类型的操作数,则进行自动转换。自动转换的原则是将低类型向高类型转换。

数据类型由低到高依次为:char (unsigned char) short (unsigned stort) int (unsigned int) long (unsigned long) float double

3)、表达式的结果

对于加减乘除运算符两侧操作数相同时表达式结果类型与之相同,若一个类型不同则表达式结果同高类型一致(5.5+3=8.3),对于两个整型的除法运算其结果仍未整型(5/2=2),括号运算符可以提高表达式运算优先级。

4)、其他运算符

取余运算符计算两个操作数相除的余数,其只能对两个整型操作数进行取余运算,运算结果也是整型。自增运算符++,可分为前置和后置两种形式,前置该表达式值先进行加1,后置表示式等于加1之前的值。

二、位运算

1)、位反运算符 ~,单目运算符,运算规则:将0变1,将1变0。~01010101 = 10101010,对变量x进行位反运算:x= ~x。

2)、位与运算符 &,双目运算符,运算规则是:参与运算的两个位都为1,则结果为1,否则为0。

位与运算可以检查数s中某一位的状态是0还是1,可以通过与该位对应的掩码进行位与运算如:

bbbb bbbb

&   0000 0010

=   0000 00b0  (这里可检测出倒数第2位b的状态0或1)C++表示为:s&0x2

位与运算还可以将变量s的某一位的状态置为0,例如:

bbbb bbbb

&  11111 1101

=   bbbb bb0b (将倒数第2位的b置为0) C++表示为:s = s & 0xFD

3)、位或运算符 |,双目运算符,其规则是:参与运算的两个位只要有一位为1,则结果为1,否则为0。

位或运算可用于将操作数中的某个状态位置为1.例如:

bbbb bbbb

|   0000 0010

=  bbbb bb1b (将倒数第二位的b置为1) C++表示为 s= s | 0x2

4)、异或运算符^,双目运算符,其规则是:参与运算的两个位不同(0和1,或1和0),则结果为1,否则为0。

异或运算符可用于将操作数中的某个状态位反置,即将原来的0置为1,将1置为0。

bbbb bb0b

^  0000 0010

=  bbbb bb1b (将倒数第二个状态位反置为1)C++表示为 s = s^ 0x2

5)、左移运算符 << 将操作数左移指定的位数,左移时高位被移除、低位补0。

0011 0011

<<  2

=    1100 1100  C++表示 s << 2

6)、右移运算符 >> 将操作数左移指定的位数,右移时低位被移除、无符号数高位补0,有符号数高位补符号位。

0011 0011    (8位无符号)

>>  2

=    0000 1100  (地位被移除高位补0)C++表示 s>>2

1011 0011(8位有符号)

>> 2

=  1110 1100  (低位被移除高位补1)C++表示 s>>2

三、适用范围

所有参与位运算的操作数只能是整型(char、short、int和long),包括有符号和无符号格式。对于其他类型如double的操作数位运算,编译时会报错。

C++算数运算符和位运算符的更多相关文章

  1. swift:高级运算符(位运算符、溢出运算符、优先级和结合性、运算符重载函数)

    swift:高级运算符 http://www.cocoachina.com/ios/20140612/8794.html 除了基本操作符中所讲的运算符,Swift还有许多复杂的高级运算符,包括了C语和 ...

  2. java 简单认识移位运算符和位运算符

    移位运算符和位运算符本质上都是操作二进制位,因为计算机存储的是二进制数据,运算效率相对较高. 移位运算符:把整数的二进制位进行左移或右移 .左移一位,相当于这个数乘以2, 右移一位,相当于这个数除以2 ...

  3. python常用算数运算符、比较运算符、位运算符与逻辑运算符

    编辑时间: 2019-09-04,22:58:49 算数运算符 '+'.'-'.'*'.'/' :加.减.乘.除 '**':指数运算, ‘//’:整除, ‘%‘:求余数 num_1 = 15; num ...

  4. JAVA算术运算符、关系运算符和位运算符

    算术运算符 1.java的算数运算符包括+(加).-(减).*(乘)./(除).%(取余),在运算过程中出现的隐式转换原则和C语言一样:2. 高位数据向低位数据转化要使用强制转化: 关系运算符 1.j ...

  5. java的布尔运算符和位运算符

    1.布尔运算符 &&  逻辑与: ||   逻辑或: !=  不等于: 三元操作符:?: :表达式为  condition?expression1:expression2(当条件为真时 ...

  6. c语言基础表达式, 关系运算符, 逻辑运算符, 位运算符, 数据的取值范围, 分支结构(if...else, switch...case)

    1.表达式: 表达式的判断是有无结果(值), 最简单的表达式是一个常量或变量, 如:12, a, 3 + 1, a + b, a + 5 都是表达式 2.BOOL(布尔)数据类型: c语言中除了基本数 ...

  7. js之运算符(位运算符)

    一.概念 位运算在数字底层(表示数字的32个数位)进行运算的.由于位运算是低级的运算操作,所以速度往往也是最快的,但是它很不直观,许多场合不能够使用.大多数语言都提供了按位运算符,恰当的使用按位运算符 ...

  8. C语言运算符(位运算符)+(赋值运算符)

    实列 1 #include <stdio.h> 2 3 int main() 4 { 5 6 unsigned int a = 60; /* 60 = 0011 1100 */ 7 uns ...

  9. Java 逻辑运算符、位运算符、移位操作符 总结(Java 学习中的小记录)

    Java 逻辑运算符.位运算符.移位操作符  总结     作者:王可利(Star·星星) 逻辑运算符,表格如下: 解析逻辑运算符表: 1.与 (&) 特点:两个都为真的时候,结果为真.两个为 ...

随机推荐

  1. 五二不休息,今天也学习,从JS执行栈角度图解递归以及二叉树的前、中、后遍历的底层差异

    壹 ❀ 引 想必凡是接触过二叉树算法的同学,在刚上手那会,一定都经历过题目无从下手,甚至连题解都看不懂的痛苦.由于leetcode不方便调试,题目做错了也不知道错在哪里,最后无奈的cv答案后心里还不断 ...

  2. Django学习——图书相关表关系建立、基于双下划线的跨表查询、聚合查询、分组查询、F查询、Q查询、admin的使用、使用脚本调用Django、Django查看源生sql

    0 图书相关表关系建立 1.5个表 2.书籍表,作者表,作者详情表(垂直分表),出版社表,书籍和作者表(多对多关系) 一对一 多对多 本质都是一对多 外键关系 3.一对一的关系,关联字段可以写在任意一 ...

  3. 手脱FSG(2.0)

    1.查壳 2.x32dbg脱壳 在第二个xchg处使用ESP定律脱壳: 由于FSG壳特性,在跳转后位置向上查找,找到js\jne\jmp,jmp就是OEP位置: 在此处使用工具进行脱壳: 完成! 3. ...

  4. 使用client-go实现自定义控制器

    使用client-go实现自定义控制器 介绍 我们已经知道,Service对集群之外暴露服务的主要方式有两种:NodePort和LoadBalancer,但是这两种方式,都有一定的缺点: NodePo ...

  5. Windows UIA自动化测试框架学习--获取qq好友列表

    前段时间应公司要求开发一款针对现有WPF程序的自动化测试工具,在网上查资料找了一段时间,发现用来做自动化测试的框架还是比较多的,比如python的两个模块pywinauto和uiautomation, ...

  6. Bert不完全手册5. 推理提速?训练提速!内存压缩!Albert

    Albert是A Lite Bert的缩写,确实Albert通过词向量矩阵分解,以及transformer block的参数共享,大大降低了Bert的参数量级.在我读Albert论文之前,因为Albe ...

  7. Redis设计与实现2.1:数据库和事件

    数据库和事件 这是<Redis设计与实现>系列的文章,系列导航:Redis设计与实现笔记 数据库 数据库的结构定义在 redis.h/redisServer 这个结构体中,这个结构体有许多 ...

  8. Blazor和Vue对比学习(基础1.9):表单输入绑定和验证,VeeValidate和EditFrom

    这是基础部分的最后一章,内容比较简单,算是为基础部分来个HappyEnding.我们分三个部分来学习: 表单输入绑定 Vue的表单验证:VeeValidate Blazor的表单验证:EditForm ...

  9. 好客租房18-jsx阶段总结

    JSX 1jsx是react的核心内容 2jsx是在js代码中写HTML结构,是react中声明式的提现 3使用jsx配合嵌入的js表达式,条件渲染,列表渲染,可以描述任意ui结构 4推荐使用cals ...

  10. 注意:Spring Boot 2.7开始spring.factories不推荐使用了,接下来这么玩...

    如果你是Spring Boot用户的话,一定有这样的开发体验,当我们要引入某个功能的时候,只需要在maven或gradle的配置中直接引入对应的Starter,马上就可以使用了,而不需要像传统Spri ...