迅维网

查看: 3099|回复: 9
打印 上一主题 下一主题

编程问题1: 整数和整数 I

[复制链接]
跳转到指定楼层
1#
发表于 2009-12-2 12:50:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式 来自: 江苏苏州 来自 江苏苏州

马上注册,获取阅读精华内容及下载权限

您需要 登录 才可以下载或查看,没有帐号?注册

x
几乎任何编程语言都有整数,面向过程的语言里有,面向对象的语言里也有。可能很多朋友或者会编程或者学过,我这里提一个简单的问题:
整数和整数 I有什么不同?比如C语言里有:
int              
int i;

希望大家来谈谈这个问题的看法。

这个问题看似简单,真要说清楚恐怕得动一番脑筋,即使编程很熟练语言很熟悉的朋友也不见得就一定说得清楚。

2#
发表于 2009-12-2 13:16:35 | 只看该作者 来自: 重庆 来自 重庆
目前,单片机下位机程序多用C编程,对数据的类型要求很严格。
在C程序中,int 表示一种数据类型:有符号整型。在8/16位机(32位机中4字节)中占2个字节的空间。数值范围:-32768---32767。

int i ; //是一个C语句,表示定义了一个变量 i,占2个字节的空间(8位机),数据的类型是有符号整型,其数值的变化范围在 -32768--32767之间的整数。

在我的一篇范例中有一句:(http://www.chinafix.com.cn/thread-153934-1-1.html
signed char i,j;        //有符号字符取值范围:-128—127,占用一个字节。

在单片机中,RAM是非常“奇缺”的,有些单片机仅有几百字节。为了节省RAM空间,这里没有用 int i,j;  来定义变量,就是为了节省2个字节的RAM空间。

回复 支持 反对

使用道具 举报

3#
发表于 2009-12-2 13:24:04 | 只看该作者 来自: 江苏苏州 来自 江苏苏州
余管用C语言为例,回答了面向过程语言中对整数和整数I的说法,即:整数是数据类型,整数 I中的 I 是一个变量。问题还没有完,下面各位坛友请继续。

其中的一个问题是:数据类型的功能是什么,变量的功能又是什么?

回复 支持 反对

使用道具 举报

4#
发表于 2009-12-2 14:00:55 | 只看该作者 来自: 江苏苏州 来自 江苏苏州
也许大家对面向对象的语言比较陌生,我这里补充一下:这面向对象的语言里整数是一个类,而整数 i 中的 i 是对象,当然是一个整数对象啦(不要在C++之类的书里找,也许他也说是数据类型,大多数的C++的书里这样说)。
数据类型也好,类也罢,变量也好,对象也罢,这里要分清楚数据类型(或者类)与变量(或者对象)之间的差别,这就是我想问的问题。

回复 支持 反对

使用道具 举报

5#
发表于 2009-12-2 14:16:04 | 只看该作者 来自: 江西南昌 来自 江西南昌
要真正讲清楚,估计先学会绕口令,真得难讲清呀!只能凭着当年的回忆依稀来说说,当然也不一定正确。C语言里,是否溢出可以判断它是否小于原值。如果结果较大,最好用容量大一点的来判断它是否超出你要的范围。数据上溢或下溢,都有这样一些代码,表面看起来很正确。但是由于存在着微妙的问题,执行就会失败,也是严重的错误。“简单字符”就是这种性质的错误。下面的代码也具有这样的错误。C语言对整数是不会检测溢出的,它只是简单把超出部分"切掉",其结果在一般的情况下一个符号整数是否溢出可以判断它是否小于0 ,无符号整数。
char   chToLower[   UCHAR_MAX+1   ];   
  void   BuildToLowerTable(   void   ) /*   ASCII版本*/   
          {   
                unsigned   char   ch;   
                /*   首先将每个字符置为它自己   */   
                for   (ch=0;   ch   <=   UCHAR_MAX;ch++)   
                      chToLower[ch]   =   ch;   
  /*   现将小写字母放进大写字母的槽子里   */   
  for(   ch   =   ‘A’;   ch   <=   ‘Z’;   ch++   )   
  chToLower[ch]   =   ch   +’a’   –   ‘A’;   
  }   
  ……   
  #define   tolower(ch)(chToLower[(unsigned   char)(ch)])
尽管代码看上去很可靠,实际上编程很可能使系统挂起来。看一下第一个循环,什么时候ch大于UCHAR_MAX呢?如果你认为“从来也不会”,那就对了。如果你不这样认为,请看下面的释。假设ch等于UCHAR_MAX,那么循环语句理应执行最后一次了。但是就在最后测试之前,ch增加为UCHAR_MAX+1,这将引起ch上溢为0。因此,ch将总是小于等于UCHAR_MAX,机器将进行无限的循环。通过查看代码,这个问题很明显。变量也可能下溢,那将会造成同样的困境。下面是实现memchr函数的一段代码。它的功能是通过查寻存储块,来找到第一次出现的某个字符。如果在存储块中找到了该字符,则返问指向该字符的指针,否则,返回空指针。象上面的BuildToLowerTable一样,memchr的代码看上去似乎是正确的,实际上却是错误的。  
  void   *   memchr(   void   *pv,   unsigned   char   ch,   size_t   size   )   
  {   
  unsigned   char   *pch   =   (unsigned   char   *)   pv;   
  while(   --   size   >=0   )   
  {   
  if(   *pch   ==   ch   )   
  return   (pch   );   
  pch++;   
  }   
  return(   NULL   );   
  }   
循环什么时候终止?只有当size小于0时,循环才会终止。可是size不会小于0,因为size是无符号值,当它为0时,表达式--size将使其下溢而成为类型size_t定义的最大无符号位这种下溢错误BuldToLowerTable中的错误更严重。假如,memchr在存储块中找到了字符,它将正确地工作,即使没有找到字符,它也不致使系统悬挂起来.而坚持查下去,直到在某处找到了这个字符并返回指向该字符的指针为止。然而,在某些应用中也可能产生非常严重的错误。我们希望编译程序能对“简单字符”错误和上面两种错误发出警告。但是几乎没有任何编译程序对这些问题给出警告。因此,在编译程序的销售商说有更好的编译代码生成器之前,程序员将依靠自已来发现上溢和下溢错误。但是,如果用户按照建议逐条跟踪代码,那么这三种错误就都能发现。用户将会发现,*pch在与0xff比较之前已经转换为0xffff,ch上溢为0,size下溢为0xffff。由于这些错误太微妙,用户可能花几小时仔细阅读代码,也不会发现上溢错,但是如果查看在调试状态下该程序的数据流,就能很容易地发现这些错误。

回复 支持 反对

使用道具 举报

6#
发表于 2009-12-2 19:37:59 | 只看该作者 来自: 江苏苏州 来自 江苏苏州
看来还是我来解释一下了,感兴趣的朋友不多。

int(整数)是一个数据类型或者说类,是一个相同变量或者对象的抽象集合名称,本身不能当变量使用,即不能赋值(有些C语言中确有int无变量赋值,实际上是由编译系统给定一个无名变量,对无名变量赋值,而不是对int赋值)和参与运算,而整数 i 是由该类型定义的变量,或者说由整数类定义的对象,它是可以赋值和参与运算的。这就是两者的不同。

如果上面的看不懂,我给你个比喻:
人是一个抽象类型或者类,张三、李四是一个“人”的类(或类型)定义的对象。
工作做不过来要雇佣几个人,那么你不能雇佣“人”类,只能雇佣张三、李四等具体的“人”定义下的对象,这些对象可以可以具体给你干活。但是你不能让代表整个符合“人”这样的抽象类或者类型给你干活。
另外一个意义下,你既然雇佣了整个人类,那你本身是不是也被雇佣或者不属于人类的一个对象,这个问题有点麻烦了。

不知道有没有说清楚,但愿大家能理解这个关系。
理解了整数,别的数据类型或者类也就好理解了,也不需要进一步解释了。

回复 支持 反对

使用道具 举报

7#
发表于 2009-12-2 21:42:49 | 只看该作者 来自: 重庆 来自 重庆
张老解释的很清楚了。
int 是一种数据的类型,i 是一个变量,是整型数据这个对象的具体实例。

回复 支持 反对

使用道具 举报

8#
发表于 2009-12-3 21:38:09 | 只看该作者 来自: 广东潮州 来自 广东潮州
搞不懂硬件论坛却开始讨论软件问题
我自学过C,上面的问题基本能够理解,但是让我深入去理解就觉得头脑转不过来了
最终我认为我不是做软件的材料,我觉得我还是学硬件好
这需要一点动手能力,而不是单纯坐那里靠着脑袋在思考

回复 支持 反对

使用道具 举报

9#
发表于 2009-12-4 20:30:55 | 只看该作者 来自: 重庆 来自 重庆
对计算机来说,硬件和软件本来就是分不开的。没有硬件基础知识学不好软件,同样的道理,不懂一点软件的逻辑,也学好硬件,尤其是维修。

回复 支持 反对

使用道具 举报

10#
发表于 2009-12-27 13:35:18 | 只看该作者 来自: 广西南宁 来自 广西南宁
int ,整数:C语言中的一种数据类型,是一个规则。
它规定了数据存储的长度,表示方法,数据的取值范围等。
数据类型,类,包括C语言本身,都是一个规则(或者说是规则的集合)。
int i
在C 语言中是定义一个变量。
它会依照整数的规则分配存储空间,使用i这个标识表示分配到的空间的地址。
当然:C语言中还可以把int解释为运算符——使用int的规则解释一个数据而不管它之前定义为何种类型。

回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表
附近
店铺
微信扫码查看附近店铺
维修
报价
扫码查看手机版报价
信号元
件查询
点位图 AI维修
助手



芯片搜索

快速回复