怪!int型变量取值能取到90000多??

[复制链接]
3681|15
 楼主| doublers 发表于 2008-4-2 09:57 | 显示全部楼层 |阅读模式
各位大虾:

这个程序应该很简单,但在我这儿却出现两个奇怪的现象。


程序功能:用数码管依次显示0-9

备注:P0口为数据输出来控制数码管8个阳极
      P10接数码管的阴极
      P0输出高电平P10输出低电平时数码管亮
      0-9对应为:FA,82,B9,AB,C3,6B,7B,A2,FB,EB


#include <reg52.h>

sbit        P10=P1^0;
sbit        P11=P1^1;
sbit        P12=P1^2;
sbit        P13=P1^3;
sbit        P14=P1^4;
sbit        P15=P1^5;
sbit        P16=P1^6;
sbit        P17=P1^7;

void delay(int i)
{
    while(i>1)
       i--;
}

void main(void)
{
   while(1)
    {
      P10=0;
      P0=0xFA;
      delay(98303);
      P0=0x82;
      delay(98303);
      P0=0xB9;
      delay(98303);
      P0=0xAB;
      delay(98303);
      P0=0xC3;
      delay(98303);
      P0=0x6B;
      delay(98303);
      P0=0x7B;
      delay(98303);
      P0=0xA2;
      delay(98303);
      P0=0xFB;
      delay(98303);
      P0=0xEB;
      delay(98303); 
    }
}


问题1:从观察窗口看P0的值,在PC指针经过“P0=0xFA;”后P0的值为什么没有
       变成FA,而是在下条delay语句执行完后P0的值才变为FA?
问题2:void delay(int i)中定义的是int型,为什么其值可以取道98303,它      的范围不是0-65535么?
xzhenggen 发表于 2008-4-2 10:10 | 显示全部楼层

你调试运行一下,是否你的int i变量值达到了90000?

 楼主| doublers 发表于 2008-4-2 10:15 | 显示全部楼层

倒是忘了看i的值,但是

在运行时我忘了看i的值,但在编译时怎么没有提示出错呢?并且为什么取值
可以到98303,98304都不行!!

谢谢!!
wangkj 发表于 2008-4-2 11:06 | 显示全部楼层

自动溢出翻转了

 楼主| doublers 发表于 2008-4-2 11:34 | 显示全部楼层

P0的值为什么没有马上变成FA呢?

在PC指针执行过“P0=0xFA;”后P0的值为什么没有马上变成FA呢?呵呵
ayb_ice 发表于 2008-4-2 11:37 | 显示全部楼层

取浮点都可以

但这只是表面现象。。。
 楼主| doublers 发表于 2008-4-2 11:41 | 显示全部楼层

能行么?

六楼仁兄的意思是可以给int型变量赋任何值?
ayb_ice 发表于 2008-4-2 12:16 | 显示全部楼层

不信你试试。。。

 楼主| doublers 发表于 2008-4-2 13:32 | 显示全部楼层

可能是很多初学者都可能会遇到的问题

这个问题虽然很简单,但可能是很多初学者都可能会遇到的问题,哪位大虾能给解释一下
wangkj 发表于 2008-4-2 13:43 | 显示全部楼层

赋予任何值是否成功得看你用的编译器

编译器也是程序,不可能100%正确。
mohanwei 发表于 2008-4-2 15:24 | 显示全部楼层

溢出了。

 楼主| doublers 发表于 2008-4-3 09:09 | 显示全部楼层

编译器竟然不能识别出来

ayb_ice 仁兄说的对,signed char i;i=70000;编译器竟然不能识别出来
后学 发表于 2008-4-3 09:28 | 显示全部楼层

sizeof (int)

一般得到的结果是4吧,

虽然ANSI规定了int的范围为-32768~32767,但你的编译器可能没有限制那么小的范围,
 楼主| doublers 发表于 2008-4-3 10:30 | 显示全部楼层

谢谢各位大虾了,第二个问题基本上弄清楚了

jimoom 发表于 2008-4-3 16:57 | 显示全部楼层

!!

能赋值才是正常的。 
这相当于你把长整形的值赋给整形的变量,任何C编译器都应该支持吧,这过程中只是丢失了一些数据。
 楼主| doublers 发表于 2008-4-3 17:14 | 显示全部楼层

这些数据指的是什么数据呢

15楼jimoom仁兄:你所说的“这过程中只是丢失了一些数据”这些数据指的是什么数据呢?是我给它赋的值么?
谢谢jimoom仁兄的指导!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

37

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部