1、按位取反运算符 " ~ "
~1 = -2
~00000001(补码) = 11111110(补码) —— 按位取反
11111110(补码) = 11111101(反码) —— -1
11111101(反码)= 10000010(机器码) —— 除去符号位,按位取反
10000010(机器码)= -2
2、左移运算符 " << "
补码按位左移,右侧补0
-1<<2 = -4
10000001(机器码) = 11111111(补码)
11111111<<2 = 11111100(补码)
11111100(补码)= 11111011(反码)
11111011(反码)= 10000100(机器码)
3、右移运算符 " >> "
补码按位右移,正数左侧补0,负数左侧补1
-1>>2 = -1
10000001 (机器码) = 11111111(补码)
11111111(补码)>> 2 = 11111111(补码)
11111111(补码) = 11111110(反码)
11111110(反码) = 10000001(机器码)
10000001(机器码)= -1
注:机器码、反码和补码转换
正数的机器码、反码和补码都是机器码本身;
负数的机器码、反码和补码之间的转换:
机器码 (按位取反)--> 反码 (+1)--> 补码
补码(-1)--> 反码(按位取反) --> 机器码
4、运算符优先级
运算符优先级为从右到左的运算符有:
(1)一元运算符:+ - ! ~ ++ - - (type)* & sizeof
(2)条件运算符:?:
(3)赋值运算符:= += -= *= /= %=>>= <<= &= ^= |=
运算符优先级为从左到右的运算符有:
(1)逗号运算符:,
逗号运算符会顺序执行一系列运算。整个逗号表达式的值是以逗号分隔的列表中的最后一个表达式的值。