C语言中的左移运算符

3

我正在学习左移运算符,为了将一个数字乘以10,我使用了以下代码。

long int num=a<<3+a<<1;

这样,数字a首先乘以8,然后再乘以2,在相加得到a*10,存储在num中。

但它给出了一些奇怪的结果,例如对于5,结果是2560,对于6,结果是6144。

有人能解释一下这个实现有什么问题吗?


请注意,在现实世界中,永远不需要使用左移运算符来进行乘以10的操作。在任何系统上,long int num = a * 10L 都可以正常工作,并产生最快的代码。 - Lundin
5个回答

2
你的问题在于运算符的优先级 - 运算符执行的顺序。+ 的绑定比 << 更紧密,因此:
a<<3+a<<1
实际上意味着:a << (a+3) << 1
对于5来说,即为 5 << 8 << 1 ,结果是2560 :)
你需要的是:(a<<3) + (a<<1)
参见:http://www.swansontec.com/sopc.html 以了解更多信息。

1
您正在使用的格式实际上是这样的。
num=a<<(3+a)<<1;

使用括号来区分位移运算符的两种应用方式,例如:
num=(a<<3)+(a<<1);

1

关于 warning: suggest parentheses around ‘+’ inside ‘<<’ 怎么处理?


编译后我没有收到任何警告。 - nomorequestions
1
只有在启用的情况下它们才可用。 - glglgl
1
@user3160274 然后提高严格程度。例如 cc -Wall file.c - Dayal rai

0
"

<< 运算符的优先级低于 + 运算符 (拇指规则:一元算术关系逻辑),因此请使用括号。

"
     int num = (a<<3) + (a<<1);

2
移位和加法都是算术运算符,拇指规则如何帮助?此外,&^也是算术运算符,优先级低于所有关系运算符。更好的拇指规则是:当有疑问时,请查看运算符优先级表 - Lundin

0

+<< 之前被处理。

使用 (a<<3)+(a<<1)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接