【问题标题】:What does the C standard say about bitshifting more bits than the width of type?C 标准对位移比类型宽度更多的位有什么看法?
【发布时间】:2012-06-30 00:31:07
【问题描述】:

考虑以下代码:

int i = 3 << 65;

我希望结果是i==0,但实际结果是i==6。通过一些测试,我发现使用以下代码:

int i, s;
int a = i << s;
int b = i << (s & 31);

a 和 b 的值始终相同。

C 标准是否说明了移位超过 32 位(int 类型的宽度)或者这是未指定的行为?

【问题讨论】:

    标签: c bit-shift


    【解决方案1】:

    根据我的 WG12/N1124 草案(不是标准,但对我来说已经足够了),6.5.7 按位移位运算符中有以下块:

    如果右操作数的值为负数或为 大于或等于提升的左操作数的宽度,则行为未定义。

    所以,未定义。小心点。

    【讨论】:

    • “对我来说足够好”——对每个人都足够好,因为标准包含完全相同的语言。 :-) 请注意,您还可以在open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf 免费获得 C99 + TC3,它也有相同的语言,所以即使您没有标准本身,您也可以很确定它说的是什么!
    • 您还可以在此处获得更易于阅读的 html 版本:port70.net/~nsz/c/c99/n1256.html
    • @R..,哦,谢谢,这将比 PDF 更容易阅读。 :)
    • @Jim:感谢您的确认和链接——当我需要这些链接时,我永远找不到它们。 :)
    猜你喜欢
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多