51单片机C语言程序大小

51单片机C语言程序大小,第1张

52单片机也只有8K的ROM14K的程序太大了,只有加外部ROM了。不是因为C语言的程序太大了,如果是破解了KEIL编译器之后,可以编译无穷大的软件,没有破解只能编译2K,

clc;clear;close all

U=[0 053 149 239 328 424 476 530 559 585 627 659 678 696 711 726 734 776 812 848 868 883 906 927 940];

I=[1140 1121 1029 962 884 825 774 729 706 675 639 615 602 589 577 565 553 523 501 446 395 348 255 154 85];

R=1000U/I;

P=UI;

A=0:1:800;

B=spline(R,P,A);

plot(A,B,'linewidth',2,'markersize',16)

你直接去掉最后一个0不久可以了?

0x3f3f3f3f翻译下二进制就是00111111001111110011111100111111

如果问题中各数据的范围明确,那么无穷大的设定不是问题,在不明确的情况下,很多程序员都取0x7fffffff作为无穷大,因为这是32-bit int的最大值。如果这个无穷大只用于一般的比较(比如求最小值时min变量的初值),那么0x7fffffff确实是一个完美的选择,但是在更多的情况下,0x7fffffff并不是一个好的选择。

很多时候我们并不只是单纯拿无穷大来作比较,而是会运算后再做比较,例如在大部分最短路径算法中都会使用的松弛 *** 作:

if (d[u]+w[u][v]<d[v]) d[v]=d[u]+w[u][v];

我们知道如果u,v之间没有边,那么w[u][v]=INF,如果我们的INF取0x7fffffff,那么d[u]+w[u][v]会溢出而变成负数,我们的松弛 *** 作便出错了,更一般的说,0x7fffffff不能满足“无穷大加一个有穷的数依然是无穷大”,它变成了一个很小的负数。

除了要满足加上一个常数依然是无穷大之外,我们的常量还应该满足“无穷大加无穷大依然是无穷大”,至少两个无穷大相加不应该出现灾难性的错误,这一点上0x7fffffff依然不能满足我们。

所以我们需要一个更好的家伙来顶替0x7fffffff,最严谨的办法当然是对无穷大进行特别处理而不是找一个很大很大的常量来代替它(或者说模拟它),但是这样会让我们的编程过程变得很麻烦。在我读过的代码中,最精巧的无穷大常量取值是0x3f3f3f3f,我不知道是谁最先开始使用这个精妙的常量来做无穷大,不过我的确是从一位不认识的ACMer(ID:Staginner)的博客上学到的,他/她的很多代码中都使用了这个常量,于是我自己也尝试了一下,发现非常好用,而当我对这个常量做更深入的分析时,就发现它真的是非常精巧了。

0x3f3f3f3f的十进制是1061109567,也就是10^9级别的(和0x7fffffff一个数量级),而一般场合下的数据都是小于10^9的,所以它可以作为无穷大使用而不致出现数据大于无穷大的情形。

另一方面,由于一般的数据都不会大于10^9,所以当我们把无穷大加上一个数据时,它并不会溢出(这就满足了“无穷大加一个有穷的数依然是无穷大”),事实上0x3f3f3f3f+0x3f3f3f3f=2122219134,这非常大但却没有超过32-bit int的表示范围,所以0x3f3f3f3f还满足了我们“无穷大加无穷大还是无穷大”的需求。

最后,0x3f3f3f3f还能给我们带来一个意想不到的额外好处:如果我们想要将某个数组清零,我们通常会使用memset(a,0,sizeof(a))这样的代码来实现(方便而高效),但是当我们想将某个数组全部赋值为无穷大时(例如解决图论问题时邻接矩阵的初始化),就不能使用memset函数而得自己写循环了(写这些不重要的代码真的很痛苦),我们知道这是因为memset是按字节 *** 作的,它能够对数组清零是因为0的每个字节都是0,现在好了,如果我们将无穷大设为0x3f3f3f3f,那么奇迹就发生了,0x3f3f3f3f的每个字节都是0x3f!所以要把一段内存全部置为无穷大,我们只需要memset(a,0x3f,sizeof(a))。

所以在通常的场合下,0x3f3f3f3f真的是一个非常棒的选择。

1/0,0不能为除数,会报出javalangArithmeticException: / by zero的异常,建议写计算器程序之前,先判断一下,或者是使用try-cathc捕获异常来处理

C语言里是没有规定必须给变量初始化的,你不给他初始化,而直接使用会出问题的。但是在调试模式下,一般变量都初始化为0xCC,这个是CPU中断3的代码,程序执行到这里就会跳出来,动态分配的内存被删除时会给他赋值0xCD,这也是CPU中断的代码。如果你在调试程序是,发现有变量是这些值,说明有可能使变量没有初始化而出现了错误。

如果你想给变量初始化为0x7F7F7F7F就这么定义变量

int x = 0x7F7F7F7F;

以上就是关于51单片机C语言程序大小全部的内容,包括:51单片机C语言程序大小、matlab中R的最后一个值为无穷大,如何编写程序跳过这个点正确做出二维图、关于0x3f3f3f3f的一些问题,大神帮忙等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9280808.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存