求教如果给P1,P2赋值负数,或超过8的数会有什么效果
比如0开始一直加一,或一直减一,有尽头吗?多少是尽头?实际keil中可赋值很大,0一直减一,接led循环,keil中int的值最大是多少?为何int a; a=1000000000000000000;也可以编译通过? 有这功夫,自己去试验一下,结果早出来了 int是16位整数 BG4RFF 发表于 2014-5-31 19:38
int是16位整数
为何int a; a=1000000000000000000;也可以编译通过? 这跟水桶装水一样,装满了就流出来了,最多也就装一桶水。
本帖最后由 michael.yang 于 2014-5-31 21:08 编辑
做编译器的哥们心里在骂:“为毛你犯了错,却要我来帮你擦屁股”。 68336016 发表于 2014-5-31 20:06
这跟水桶装水一样,装满了就流出来了,最多也就装一桶水。
转成汇编看到编译器不区分 int 和unsiged int 都是+-65535,超过后直接mov A到地址了,但给P1P2赋值语句输入P2=1111111时被当成二进制赋值过去了,P2=32423434242的时候时一个值,而且赋值可以无穷大,请问这个赋值和
编译器中的执行结果有什么关系? 编译器负责把数字转长转短, 至于怎么转, 自己去查C语言的类型转换.
但给P1P2赋值语句输入P2=1111111时被当成二进制赋值过去了, 你确认吗?
65535放到int或者u int, 在内存的内容并无变化,变化的是你的指令如何解读他们. 你把他解读为两个char都是没问题的 int 貌似范围在-3.2w ~ +3.2w之间吧??? albert_w 发表于 2014-6-1 09:04
编译器负责把数字转长转短, 至于怎么转, 自己去查C语言的类型转换.
但给P1P2赋值语句输入P2=1111111时被 ...
是的,keil v4, 只要11111111小于八位,就变成二进制方式,很大的数和负数是怎么转换成对应的P2 0~255的数的? 呵呵 楼主来逗大家玩的嘛 a=1000000000000000000,编译器是先把100000000000000.....转换成二进制数,再截取最右边的16位赋值给a。至于为什么编译器不提示有错,很简单,因本来就没错。 刚试了一下,我是KEIL UV5。C51的工程,编译可以通过,值是0X0100;ARM CM3的工程,编译也可以通过不过有警告,值是long long转int,是个负数。
见图如下 12楼正解 本帖最后由 viq505 于 2014-6-10 09:47 编辑
这个问题我有经验,确实能编译通过。我曾经做过一个oled的屏显示温度,结果便已出现温度超过26.0度就会显示00.0,27.0就显示01.0(编译无错误),分析发现温度值数据类型定义的unsigned char型造成的,后将温度值数据类型定义为int型。问题解决。
不发链接了,你百度《可怕的26℃》就能找到我发的帖子(lcdhome论坛)。 本帖最后由 MCUStudent 于 2014-6-10 20:28 编辑
viq505 发表于 2014-6-10 09:40
这个问题我有经验,确实能编译通过。我曾经做过一个oled的屏显示温度,结果便已出现温度超过26.0度就会显示 ...
哈哈!原来我还有“同犯”,我几年前做了一个3208LED时钟带温度显示(DS18B20),应该是冬天或春天完成的。后来天气热了,发现有时温度只有几度,觉得不对,更换传感器无果,不得其解。又观察了一段时间发现只要超过25度才这样,因没想好是啥原因没有动它(程序都忘了存哪了),反正也不怎么用得着看温度,也就没当回事,也没和别人交流过,没事时抬头看见它就想两下。大约去年想到可能是定义变量的数据类型不对,也懒得弄(都好几年了)。今天见大侠提及此问题,我的判断得到了证实,凑个热闹。等哪天有时间把程序找找改过来。 MCUStudent 发表于 2014-6-10 20:17
哈哈!原来我还有“同犯”,我几年前做了一个3208LED时钟带温度显示(DS18B20),应该是冬天或春天完成的 ...
{:handshake:} 学习单片机还是要实践啊!
页:
[1]