移位运算中有两种右移形式,算术右移和逻辑右移。逻辑右移左端补0。算术右移用左端最高有效位的值填充。在C语言中,并没有明确定义使用哪种类型的右移。但是在实际中,算术右移一般用于有符号数,逻辑右移一般用于无符号数,Java有明确的定义,比如a>>k表示算术右移,a>>>k表示逻辑右移shiftUndefinedBehaviorUndefinedBehavior指的是C语言标准没有规定的行为。编译器可能不会报错,但是编译器会自己处理这些行为,所以不同的编译器会有不同的结果,什么事情都有可能发生。这是一个很大的隐患,所以我们应该尽量避免这种情况的发生。在几个未定义行为的情况下,在移位操作过程中,移动的位数超过了原始数据长度。在studio中,编译器认为36%32(int类型的位数)之后得到的4就是要移动的位数。表达式计算时,编译器的计算顺序不同,导致结果不同b=++a+++a+++a;不能保证在输出变量的原始值之后和计算表达式的其余部分之前会立即发生递增或递减。移位运算的优先级移位运算的优先级远低于加减运算。先进行加减运算,再进行移位运算。为了保证表达式按照自己的想法进行操作,不管你是否知道操作优先级,加括号是最好的选择,注意公众号,让我们一起努力
