C++算数运算符和位运算符

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

三、适用范围

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

posted @   KylinZhuang  阅读(811)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示