找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

c语言位移问题

查看数: 1657 | 评论数: 13 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2025-4-10 21:38

正文摘要:

b是1向左移动1位为什么变成7?d是1向左移动16位为什么变成0?

回复

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

我说的就是Keil C51,你不去试试怎么知道?
ID:1109793 发表于 2025-4-26 18:33

在KEILC51里面,应该加类型转换,否则就不行。其他的我没试过,没有条件
ID:879809 发表于 2025-4-26 18:00
xiaobendan001 发表于 2025-4-11 07:53
你有没有注意,定义的b是long,监视窗口里面的是char?
事实上每次重新编译之后,变量地址都不一定一样,所 ...

你自己试试1<<8好不好用,这个位移是编译器在编译期间计算出来的,哪来的什么八位?
ID:1109793 发表于 2025-4-12 12:30

这个写法是在哪儿看到的?
ID:281889 发表于 2025-4-11 21:51
xiaobendan001 发表于 2025-4-11 07:53
你有没有注意,定义的b是long,监视窗口里面的是char?
事实上每次重新编译之后,变量地址都不一定一样,所 ...

感谢,按照你说的可以了
ID:281889 发表于 2025-4-11 21:43

这样可以,感谢
ID:879809 发表于 2025-4-11 16:48
c编译器常量如果不加U、L等修饰符,默认是int类型的,而C51的int型是16位的,1<<16毫无疑问的就是0。
ID:1109793 发表于 2025-4-11 13:13
huashanhui20 发表于 2025-4-11 08:27
我帮你试了下,结果很不一样

你这很明显不是C51的编译器
ID:192020 发表于 2025-4-11 09:19
点运行了吗?或者设断点了吗
ID:878061 发表于 2025-4-11 08:27
我帮你试了下,结果很不一样

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

51hei.jpg
ID:68189 发表于 2025-4-11 08:18
                b = (1UL<<1);
                c = (1UL<<2);
                d = (1UL<<16);
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:227393 发表于 2025-4-11 05:10
放while(1)前面就可以了,不然一直再左移

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

Powered by 单片机教程网

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