8位单片机,整型数组是多少位?

shanqiubin   2009-5-21 19:45 楼主
PIC16F73,定义了一个整型数组,int a[100],在调试时从watch窗口发现a是0xf090,有问题吗?
还有,int b=200,b/9会是多少?

回复评论 (13)

定义了一个整型数组,int a[100],在调试时从watch窗口发现a是0xf090,有问题吗?
可能数组的首地址是0xf090

int b=200,b/9会是多少?
22
点赞  2009-5-21 20:15
1、为什么是16位的?我用的是8位单片机呀。
2、也就是b/9会自动取整?
点赞  2009-5-21 20:18
数据类型是和编译器相关的。但char总是8bit, int可能是16bit也可能是32bit, long int总比short int位数宽。

8位单片机是指内部数据线的宽度,CPU一次读取数据最宽是8bit(1Byte)。所以从程序效率的角度讲尽量使用和CPU数据宽度相同的数据类型,否则会增加指令的。   
点赞  2009-5-21 21:21
呵呵, 看看你AD结果是多少位啊。 8位当然可以了, 不过一般需要做简单的均值滤波的, 这样就多个AD结果相加就可能超过8位,这就需要更长的数据类型。

数据类型是很基础很重要的东西,多看看书吧, 否则出了问题还不知道是怎么回事呢。
点赞  2009-5-21 21:29
均值滤波就是多次求平均值?我做了。估计是不是这个原因导致的?
我定义的是int a[]型的。
A/D后的结果应该是16进制的,可不可以直接存为10进制的?还是要自己来做?
点赞  2009-5-21 21:34
计算机看到的都是二进制,16进制只是表示方便,和二进制一样的。

你为什么要转换成10进制,是为了观察直观吗,如果是这样在调试的时候好像右键可以选择显示成10进制的。
点赞  2009-5-21 21:41
十六进制和十进制还不都是一样的,只是给你看的形式不同。
8位机使用16位地址的话,地址的值当然就是16位的,a【】是数组的首地址。
点赞  2009-5-22 09:30
1、为什么是16位的?我用的是8位单片机呀。
2、也就是b/9会自动取整?

这两个都是C语言的问题

点赞  2009-5-21 20:48
提示: 作者被禁止或删除 内容自动屏蔽
点赞  2009-5-21 21:23
8位机里a地址有可能是16位有可能是32位,看怎么使用呢
int型几乎都是16位以上的。跟编译器有关。
AA/BB 这个要取整
点赞  2009-5-22 09:57
提示: 作者被禁止或删除 内容自动屏蔽
点赞  2009-5-22 22:47
int型几乎都是16位以上的。跟编译器有关。
点赞  2011-12-15 11:58
换个角度来看问题。
 看到的资料都说int是一个机器字长,所以8位机貌似就该是 8位字长。
不过比如说对于32位机器,它的任何指针字长都是32位,也就是说,地址宽度是32位。 那么,8位的51,它的地址总线也是16位的。所以它们的最大寻址范围都是64K。 那么,也就不难理解为啥它的int,机器字长是16位了。
 其实最好的办法是使用前,在具体的编译器和硬件上sizeof一下,然后typedef成 uint8 uint16一类的,不然你会晕头转向、

搜了一下百度,有两个文章可供参考

http://blog.csdn.net/s04023083/article/details/5182700

http://topic.csdn.net/u/20090626/17/dbca5fb5-22c2-4d6b-ae89-08d938679077.html

觉得其中一句话最重要:
int是机器字长,但机器字长 和 CPU取指字长,如果带操作系统,还有 系统字长 都不太一样。
以地址总线宽度来对比机器字长是最好的。因为一个机器字长的操作是最快最常用的。

忽然想起以前似乎听人说过,51这些8位单片机有点点不伦不类——我意思是像C语言,有点奇奇怪怪,估计是限制与当时的条件,不然怎么会闹出个8位CPU取指长度,却有一个16位的地址总线?但它却无比灵活。

也许是因为造价问题吧。毕竟做一个16位的CPU要比做一个8位的CPU贵(51存在了大概20年),可是,总不能寻址范围只有256B吧?
[ 本帖最后由 辛昕 于 2011-12-16 13:38 编辑 ]
强者为尊,弱者,死无葬身之地
点赞  2011-12-16 13:27
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复