【BUG】C语言|左移之后,最高位的数字还在吗?(整型提升)
问题概述
这个错是刚学c语言的时候碰到的,突然好想我的c语言老师,所以在此记录一下。
#include<stdio.h>
void main(){
unsigned short a=0x1000,debug,bug;
bug=a<<4>>4;
debug=a<<4;
debug=debug>>4;
printf("%x %x\n%d %d",bug,debug,sizeof(bug),sizeof(debug));
}
这里的运行结果是1000 0 2 2。因为我只截取了这一个突出问题,所以结果比较明显。
我希望得到的结果是0,但是如果直接往左移再往右移,由于整型提升[1],在运算过程中实际使用的是int类型,所以得到的结果是1000。
最高位数字只是在它能去的地方走了一趟,然后又回到原点,什么也没改。
[1]整型提升是C程序设计语言中的一项规定:在表达式计算时,各种整形首先要提升为int类型,如果int类型不足以表示则要提升为unsigned int类型;然后执行表达式的运算。
如果拆开赋值,在赋值过程中,4字节赋值给2字节的变量,得到的自然是2字节的值,所以并没有出错,符合预期,得到结果为0。
应用
做循环位移类题目时可能会被坑。
如果想通过左移之后右移的方式把高位弄没,对于unsigned short变量,不能直接z=x<<4>>4,而应该分开写成z=x<<4,z=z>>4。
怀旧
当时对整型提升只是个模模糊糊的概念,误以为是栽在了内存溢出啊、强制类型转换啊之类的听起来高大上的坑上。于是鼓起勇气,跑讲台上问老师——这是俺大学第一次问老师题目~
因为问题表面有点扭曲,一开始老师也没找到问题根源嘿嘿嘿。因为这个问题是整型提升的典型,还特意在班上讲到了~(超高兴)
老师人超级好。这是大学第一个能认出我的老师~c语言只学一学期,太可惜了,以后找机会还选他的课(虽然卷子出得挺难)(期末没考好好难过,感觉愧对信任orz)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix