1.算数操作符
- a.+ 加号
- b.- 减号
- c.* 乘号
- d./ 除号 当 / 的两边都为整形时,计算结果默认为 int 。当 / 两边任意一边出现小数,计算结果为float or double
-
- e.% 取模 % 计算的是两数相除后的余数,其两边必须为 int ,整除时结果为 0
复制代码 2.移位操作符
使用条件:只能对于 int类型 使用,无符号整型这里算作正数。移位操作符移动的位数不能为负数,标准未定义这种写法,所以在不同编译器中有不同结果- a.<< 左移 对整数的补码左移一位 左边丢弃,右边补零
- b.>> 右移 对整数的补码右移一位 算数移位:右边丢弃,左边补原符号位
- 逻辑移位:右边丢弃,左边补零 //算数移位和逻辑移位取决于编译器,大部分是算数移位
复制代码 整数的二进制表达有三种
(原码,反码,补码)
对于正整数来说,三种表达方式在数值上是相同的,而负整数的三种表达在数值上并不相同- //例:
- 7
- 00000000 00000000 00000000 00000111——32位原码
- 00000000 00000000 00000000 00000111——32位反码
- 00000000 00000000 00000000 00000111——32位补码
- // 由于 int 类型内存大小为 4 个字节,其存储方式为32bit的二进制,第一位为字符位,为 1 表示负数,0 为正数 ;
- -7
- 10000000 00000000 00000000 00000111——32位原码
- 11111111 11111111 11111111 11111000——32位反码
- //反码是将原码中除字符位以外的bit位由 1 变为 0 ,由 0 变为 1 ;
- 11111111 11111111 11111111 11111001——32位补码
- //补码就是在反码的基础上 + 1 ;
复制代码 那么移位操作符是如何使用的,下面我举一个例子- int main()
- {
- int a = 7;
- int b = 0;
- b = a << 1;
- //此时输出 b 的结果为 14 —————— 00000000 00000000 00000000 00001110
复制代码 b.函数调用操作符- int main()
- {
- int c = -7;
- b = c << 1; //此时输出 b 的结果为 -14 ————— 11111111 11111111 11111111 11110010补码
- }
复制代码 c.访问结构体成员- a.& 按位与 //与:对于两个二进制数,&的两边都为1,与的结果为1,两边只要有0,结果为0
- b.| 按位或 //或:对于两个二进制数,|的两边都为0,或的结果为0,两边只要有1,结果为1
- c.^ 按位异或 //异或:对于两个二进制数,相同结果为0,相异结果为1
复制代码 都是对于结构体的成员使用时才会用到- //例1:
- int main()
- {
- int a = 8; //00000000 00000000 00000000 00001000 8的补码
- int b = -4; //11111111 11111111 11111111 11111100 -4的补码
- int c = 0;
- c = a & b //00000000 00000000 00000000 00001000 结果的补码,由于是正数,所以原码也是这个,结果为8
- a | b = //11111111 11111111 11111111 11111100 结果的补码
- //11111111 11111111 11111111 11111011 反码
- //10000000 00000000 00000000 00000100 原码,结果为-4
- a ^ b = //11111111 11111111 11111111 11110100 补码
- //11111111 11111111 11111111 11110011 反码
- //10000000 00000000 00000000 00001100 原码,结果为-12
- }
复制代码 总结:操作符的计算顺序呢,是由优先级和结合性来共同决定的,当然他们也不能完全决定,大量的特别复杂的操作符的使用可能会造成在不同编译器的场景下的出的结果不同的情况,所以能用简洁分步的方式尽量简洁分步骤,不然代码就可能是垃圾代码。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |