找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 486|回复: 12
收起左侧

c语言位移问题

[复制链接]
ID:281889 发表于 2025-4-10 21:38 | 显示全部楼层 |阅读模式
b是1向左移动1位为什么变成7?d是1向左移动16位为什么变成0?
51hei图片_20250410213754.png
回复

使用道具 举报

ID:227393 发表于 2025-4-11 05:10 来自手机 | 显示全部楼层
放while(1)前面就可以了,不然一直再左移
回复

使用道具 举报

ID:1109793 发表于 2025-4-11 07:53 | 显示全部楼层
你有没有注意,定义的b是long,监视窗口里面的是char?
事实上每次重新编译之后,变量地址都不一定一样,所以稳妥之下,要删除重新加入。这个是KEIL的一个BUG吧。就是说监视里面的那个b,根本不是你定的那个b,所以等于啥也没有意义。
d为何为0,原因是你括弧里面的1,默认的是char的,左移16次,当然是0,实际上8次也是0。你改成这样
d = ((long)1<<16);
就是你想要的0x10000了。
回复

使用道具 举报

ID:68189 发表于 2025-4-11 08:18 | 显示全部楼层
                b = (1UL<<1);
                c = (1UL<<2);
                d = (1UL<<16);
回复

使用道具 举报

ID:878061 发表于 2025-4-11 08:27 | 显示全部楼层
我帮你试了下,结果很不一样
51hei.jpg
回复

使用道具 举报

ID:192020 发表于 2025-4-11 09:19 | 显示全部楼层
点运行了吗?或者设断点了吗
回复

使用道具 举报

ID:1109793 发表于 2025-4-11 13:13 | 显示全部楼层
huashanhui20 发表于 2025-4-11 08:27
我帮你试了下,结果很不一样

你这很明显不是C51的编译器
回复

使用道具 举报

ID:879809 发表于 2025-4-11 16:48 | 显示全部楼层
c编译器常量如果不加U、L等修饰符,默认是int类型的,而C51的int型是16位的,1<<16毫无疑问的就是0。
回复

使用道具 举报

ID:281889 发表于 2025-4-11 21:43 | 显示全部楼层

这样可以,感谢
回复

使用道具 举报

ID:281889 发表于 2025-4-11 21:51 | 显示全部楼层
xiaobendan001 发表于 2025-4-11 07:53
你有没有注意,定义的b是long,监视窗口里面的是char?
事实上每次重新编译之后,变量地址都不一定一样,所 ...

感谢,按照你说的可以了
回复

使用道具 举报

ID:1109793 发表于 2025-4-12 12:30 | 显示全部楼层

这个写法是在哪儿看到的?
回复

使用道具 举报

ID:879809 发表于 2025-4-26 18:00 | 显示全部楼层
xiaobendan001 发表于 2025-4-11 07:53
你有没有注意,定义的b是long,监视窗口里面的是char?
事实上每次重新编译之后,变量地址都不一定一样,所 ...

你自己试试1<<8好不好用,这个位移是编译器在编译期间计算出来的,哪来的什么八位?
回复

使用道具 举报

ID:1109793 发表于 2025-4-26 18:33 | 显示全部楼层

在KEILC51里面,应该加类型转换,否则就不行。其他的我没试过,没有条件
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表