栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用gcc的按位移位的意外行为

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用gcc的按位移位的意外行为

根据C标准 §6.5.7.3
,按类型大小移动是未定义的行为:

6.5.7按位移位运算符
(…)如果右操作数的值为负或大于 或等于 提升后的左操作数的宽度,则行为未定义。

您的编译器应就此警告您:

$ gcc shift.c -o shift -Wallshift.c: In function ‘main’:shift.c:5:5: warning: left shift count >= width of type [enabled by default]shift.c:6:5: warning: right shift count >= width of type [enabled by default]

如果看一下gcc生成的汇编代码,您会发现它实际上是在编译时计算前两个结果。简化:

main:    movl    $0, %esi    call    printf    movl    $0, %esi    call    printf    movl    -4(%rbp), %ecx  ; -4(%rbp) is n    movl    $-1, %esi    sall    %cl, %esi       ; This ignores all but the 5 lowest bits of %cl/%ecx    call    printf    movl    -4(%rbp), %ecx    movl    $-1, %esi    shrl    %cl, %esi    call    printf


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/394288.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号