找回密码
 立即注册
查看: 589|回复: 25

该死的C251,奇怪的问题,你们有没有碰到过?

[复制链接]

17

主题

109

回帖

491

积分

中级会员

积分
491
发表于 2026-8-6 13:00:26 | 显示全部楼层 |阅读模式
  1. void main(void)
  2. {
  3.         int y=2026;
  4.         char m=6,d=14;
  5.         long n;
  6.        
  7.         n=y*10000L+m*100L+d;
  8.         //这里的n为9990
  9.         n=10000L*y+m*100L+d;
  10.         //这里的n才为20260614
  11. }
复制代码
回复

使用道具 举报 送花

33

主题

3085

回帖

7234

积分

论坛元老

积分
7234
发表于 2026-8-6 15:17:03 | 显示全部楼层
一眼数据类型问题。2026*10000+600+14 = 0x135 2706 => 0x2706 = 9990

点评

就是把y*10000L 改为 10000L*y交换位置,没想到结果完全不同。。。  发表于 2026-8-6 16:08
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复

使用道具 举报 送花

17

主题

109

回帖

491

积分

中级会员

积分
491
 楼主| 发表于 2026-8-6 15:43:21 | 显示全部楼层
_奶*** 发表于 2026-8-6 15:17
一眼数据类型问题。2026*10000+600+14 = 0x135 2706 => 0x2706 = 9990

但是这段代码,在C51中是好好的。。。

点评

你连KEIL的规则都不懂,还说我忽悠你,真无语了!  详情 回复 发表于 2026-8-6 17:11
回复

使用道具 举报 送花

11

主题

148

回帖

1443

积分

金牌会员

积分
1443
发表于 2026-8-6 15:54:19 | 显示全部楼层
有道理,按理说y*10000L,这个y应该被提升成long类型,去与10000相乘才对。
微信qsssuv
回复

使用道具 举报 送花

83

主题

8317

回帖

1万

积分

超级版主

积分
17932
发表于 2026-8-6 16:12:20 | 显示全部楼层
不是keil的问题,是你没注意溢出了。
y是int,取值为-32768~32767,你 y*10000L已经溢出,溢出的会被截断。
同理,m是char,取值-128~127,你的m*100L已经溢出,溢出的会被截断。
你改为下面的,包你不会错:
n = (long)y*10000L + (long)m*100L + (long)d;

计算时要对齐哦,C251、C51都一样的。

点评

你别忽悠我,我这个项目原本是用STC15W单片机的没问题,写到后面内存不够,换STC12K128就出错,调了很久才找到问题!  发表于 2026-8-6 16:41
回复

使用道具 举报 送花

33

主题

3085

回帖

7234

积分

论坛元老

积分
7234
发表于 2026-8-6 16:16:56 | 显示全部楼层
乘*** 发表于 2026-8-6 15:43
但是这段代码,在C51中是好好的。。。

编译器的锅,一般这种计算,为了兼容各种编译器,都会强制数据类型转换,不使用编译器自己的规则。能减少不少问题。

你要想完全搞搞清楚,就看看c251的手册。应该是都会有介绍的
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复

使用道具 举报 送花

25

主题

248

回帖

2815

积分

金牌会员

积分
2815
发表于 2026-8-6 17:07:49 | 显示全部楼层
在keil C251中实测,两种写法结果都一样为正确值。
你是用的啥编译器,什么版本的?工程打包上来看看。

keil c251 软仿真
stc.png

点评

复现出来了,把int y=2026;改成unsigned int y=2026;  发表于 2026-8-7 15:16
回复

使用道具 举报 送花

83

主题

8317

回帖

1万

积分

超级版主

积分
17932
发表于 2026-8-6 17:11:04 | 显示全部楼层
乘*** 发表于 2026-8-6 15:43
但是这段代码,在C51中是好好的。。。

你连KEIL的规则都不懂,还说我忽悠你,真无语了!

点评

问题是代码在c51中正确,在c251中不正确,难道c251就不是用keil了吗?  发表于 2026-8-7 15:52
回复

使用道具 举报 送花

25

主题

248

回帖

2815

积分

金牌会员

积分
2815
发表于 2026-8-6 17:16:20 | 显示全部楼层
基础的东西,不应该出问题呀。
回复

使用道具 举报 送花

已绑定手机

307

主题

582

回帖

2957

积分

金牌会员

积分
2957
发表于 2026-8-6 18:56:21 | 显示全部楼层
keil c251BUG太多已经放弃使用了
回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-11-7 13:18 , Processed in 0.097727 second(s), 102 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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