对int类型变量使用左移位运算符a<<3是否等价于a*8的疑问
问题解答
先纠正一个运算符误区:
你写的a*2^3在多数编程语言里不等于a*(2^3),因为^是按位异或运算符,不是幂运算。实际运算顺序是先计算a*2,再和3执行异或操作,结果和a*8完全不同。如果要表达a乘以2的3次方,直接写a*8即可,整数场景下不要用^来表示幂。关于左移运算与乘法的等价性:
- 对于无符号int或非负的有符号int:
a << 3完全等价于a*8,左移x位等价于乘以2^x的说法成立。左移操作本质是把二进制位向左移动x位、右侧补0,在无溢出的情况下,数值上就是原数乘以2的x次方。 - 对于负数的有符号int:这个等价关系不成立,且属于未定义行为。在C/C++这类语言的标准中,有符号整数左移导致溢出时,结果没有统一规定——虽然很多编译器会按补码规则移位得到看似合理的结果(比如
-1 <<3得到-8),但不同编译器、平台可能出现不同输出,绝对不能依赖这种等价关系。
- 对于无符号int或非负的有符号int:
内容的提问来源于stack exchange,提问作者ani2016
相关产品推荐
相关产品推荐

