[关闭]
@nrailgun 2015-09-22T17:30:03.000000Z 字数 746 阅读 1516

C:位偏移运算符优先级陷阱

程序设计


C 程序员经常面对底层问题,很多经常使用位偏移操作。在使用中发现一个陷阱:

C 的 <<>> 运算符优先级低于 +-

我写出了这样的代码(内核查找多处理器浮点结构):

  1. else {
  2. /* Last KB of system base memory */
  3. p = (bda[0x14] << 8) | bda[0x13];
  4. p = p << 10 - 1024;
  5. mp = mp_lookup_fp_struct_at(p, 1024);
  6. if (mp)
  7. return mp;
  8. }

向左偏移 10 位(×1024 换成 << 10,机智),然后减去 1024。然而编译器报错:

  1. gcc -I. -I../include -m32 -static -nostdinc -fno-builtin -ggdb -MD -O -fno-strict-aliasing -fno-pic -fno-omit-frame-pointer -fno-stack-protector -Werror -c mp.c
  2. mp.c: In function mp_lookup_fp_struct’:
  3. mp.c:42:3: error: left shift count is negative [-Werror]
  4. p = p << 10 - 1024;
  5. ^
  6. cc1: all warnings being treated as errors

我忘记了运算符的优先结合顺序,+ 大于 <<。运气实在是太好了,如果不是 10 - 1024 正好小于 0,我根本不会在编译期发现这个错误,在内核中又要花很多时间去调试。如果是 C++ 重载符号出这种事情那也会很蛋疼。

Generally: unary > binary > shift > bitops > logic > assignment. This rule generally works.

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注