找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1655|回复: 13
打印 上一主题 下一主题
收起左侧

c语言位移问题

[复制链接]
跳转到指定楼层
楼主
b是1向左移动1位为什么变成7?d是1向左移动16位为什么变成0?

51hei图片_20250410213754.png (22.25 KB, 下载次数: 0)

51hei图片_20250410213754.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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);
回复

使用道具 举报

5#
ID:878061 发表于 2025-4-11 08:27 | 只看该作者
我帮你试了下,结果很不一样

51hei.jpg (75.49 KB, 下载次数: 0)

51hei.jpg
回复

使用道具 举报

6#
ID:192020 发表于 2025-4-11 09:19 | 只看该作者
点运行了吗?或者设断点了吗
回复

使用道具 举报

7#
ID:1109793 发表于 2025-4-11 13:13 | 只看该作者
huashanhui20 发表于 2025-4-11 08:27
我帮你试了下,结果很不一样

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

使用道具 举报

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

使用道具 举报

9#
ID:281889 发表于 2025-4-11 21:43 | 只看该作者

这样可以,感谢
回复

使用道具 举报

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

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

使用道具 举报

11#
ID:1109793 发表于 2025-4-12 12:30 | 只看该作者

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

使用道具 举报

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

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

使用道具 举报

13#
ID:1109793 发表于 2025-4-26 18:33 | 只看该作者

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

使用道具 举报

14#
ID:879809 发表于 2025-4-29 17:51 | 只看该作者
xiaobendan001 发表于 2025-4-26 18:33
在KEILC51里面,应该加类型转换,否则就不行。其他的我没试过,没有条件

我说的就是Keil C51,你不去试试怎么知道?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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