楼上的专家能不能提醒一下还有那些操作是可能存在暗箱操作的?谢谢!
点赞  2010-6-24 09:12
没找到C89的标准,stm8s103兄能否共享一下?

附件是C99标准。
目前的现状是C89当道,却找不到C89标准。郁闷。

StandardC99.pdf (1.04 MB)

点赞  2010-6-24 10:13
                                 --
点赞  2010-6-24 10:42


呵呵,这可真是好东西,竟然找到了国标中文本的C89

StandardC89-chinese.part5.rar (1011.09 KB)

StandardC89-chinese.part1.rar (1.91 MB)

StandardC89-chinese.part2.rar (1.91 MB)

StandardC89-chinese.part3.rar (1.91 MB)

StandardC89-chinese.part4.rar (1.91 MB)

点赞  2010-6-24 13:29
个人感觉CodeVisionAVR的这种不标准还是很人性化的,用C本来就是图个方便,再说对于运算操作它都有提示可能存在的溢出问题(个人感觉比闷棍式的“隐式类型转换”还是好,查了很多资料看到的!),以方便程序员作出相应的操作选择,相信对C标准研究得很深的人还是少数吧?半路出家的应该更多吧(交个老底,本人05年中旬开始用C语言编,只是买入门本书花了两个小时看了一下就开始用到现在,没有系统学习过,说实在,现在碰到的问题也是理所当然了!今天上GOOGLE努力学习先!)?

以下为网络查询到的资料:

C语言隐式类型转换规则
1. 如果其中一个操作数为long double类型,则另一个操作数被转换为long double.
2. 否则,如果其中一个操作数为double, 则另一个操作数被转换为double.
3. 否则,如果其中一个操作数为float, 则另一个操作数也转换为float.
4. 否则,两个操作数进行 "整型升级":
    a. 如果其中一个操作数为unsigned long int, 则另一个操作数也被视为unsigned long int.
    b. 否则,如果其中一个操作数为long int,而另一个操作数类型是unsigned int, 并且long int能够表示unsigned int的所有值,则另一个操作数也被视为long int;如果long int不能表示unsigned int的所有值,则两个数都被视为unsigned long int.
    c. 否则, 如果其中一个操作数是long int,则另一个操作数也被视为long int.
    d. 否则, 如果其中一个操作数是unsigned int, 则另一个操作数也被视为unsigned int.
    e. 否则, 两个操作数都被视为int.

另据资料显示:
C99不支持隐式转换了!
以下为网络资料:
15、其它特性的改动

  放宽的转换限制
 
  限制             C89标准  C99标准
  数据块的嵌套层数       15     127
  条件语句的嵌套层数      8      63
  内部标识符中的有效字符个数  31     63
  外部标识符中的有效字符个数  6      31
  结构或联合中的成员个数    127    1023
  函数调用中的参数个数     31     127

  不再支持隐含式的int规则

  删除了隐含式函数声明


  对返回值的约束
    C99中,非空类型函数必须使用带返回值的return语句.

  扩展的整数类型
    扩展类型 含义
    int16_t 整数长度为精确16位
    int_least16_t 整数长度为至少16位
    int_fast32_t 最稳固的整数类型,其长度为至少32位
    intmax_t 最大整数类型
    uintmax_t 最大无符号整数类型

  对整数类型提升规则的改进
    C89中,表达式中类型为char,short int或int的值可以提升为int或unsigned int类型.
    C99中,每种整数类型都有一个级别.例如:long long int 的级别高于int, int的级别高于char等.在表达式中,其级别低于int或unsigned int的任何整数类型均可被替换成int或unsigned int类型.
点赞  2010-6-24 14:31
                                 嘿嘿,楼主最好去建议C的标准化委员会修改规范,
点赞  2010-6-24 14:39

好好学习,天天向上!
点赞  2010-6-24 14:54
                                 仔细再看发现IARSTM8提示的并不是隐式转换的问题,而是VOLATILE的问题!晕!
点赞  2010-6-24 15:15
                                 那个C89下载不到,能不能传到21IC?谢谢!
点赞  2010-6-24 15:16


溢出是溢出,类型转换是类型转换。

编译器如果检测到溢出,一般情况下都有警告。
(这里根本没有溢出,要溢出至少也得超过32767,
楼主才加到0x198,离溢出还远得很)


“通用算术转换”是C标准规定的一种规则,
如果这也有警告,估计一个程序下来,警告要差不多要上千了。
点赞  2010-6-24 15:39
                                 嗯!现在明白了!谢谢!
点赞  2010-6-24 16:35


为什么没人注意为啥COSMIC把STM8S的int视为16bit的。既不是8bit,也不是32bit?
8bit我服气,32bit也还行,16bit俺不明白为啥,呵呵
得找个理由、、、
点赞  2010-6-24 17:20
标准C是16位,C#才是32位。

下表列出了Turbo C中各类整型量所分配的内存字节数及数的表示范围。
类型说明符    数的范围     分配字节数
int       -32768~32767     ■■
short int    -32768~32767     ■■
signed int    -32768~32767     ■■
unsigned int   0~65535        ■■
long int  -2147483648~2147483647  ■■■■
unsigned long  0~4294967295     ■■■■


int(C# 参考)

int 关键字表示一种整型,该类型根据下表显示的大小和范围存储值。

类型  范围  大小  .NET Framework 类型  
int
-2,147,483,648 到 2,147,483,647
有符号 32 位整数
System.Int32
点赞  2010-6-24 18:24
Turbo C诞生于80286的年代,16位机。

一般32位机上,int指32位,short int指16位。
点赞  2010-6-24 18:33
百度百科:
【大小】
  依据程序编译器的不同int定义的字节数不同。   常用的单片机编译器,如KEIL下,51类单片机的C语言中,int代表2个byte(16位);如果是32位ARM处理器的C语言中,则int代表4个byte(32位)   PIC单片机的PICC中8位系列单片机的C语言里int表示16位。   而不少PC端软件的编译器则会根据操作系统或处理器(如64位XP)把int定义为8 byte(64位)   所以在多平台上编程的人员需要在使用时注意。   如需定义16位数,可使用short定义。
点赞  2010-6-24 18:37
为什么没人注意为啥COSMIC把STM8S的int视为16bit的。既不是8bit,也不是32bit?
8bit我服气,32bit也还行,16bit俺不明白为啥,呵呵
得找个理由、、、
8位MCU上,INT一般不都是16BIT的吗?
点赞  2010-6-25 09:22
讨论了半天,为什么没有人看看COSMIC的手册? 瞎子摸象?
点赞  2010-6-25 09:31
                                 强制转换是一方面,数据类型有是一方面,要充分考虑溢出的可能性,不然结果就会出错
点赞  2010-6-25 10:29


由于在各种mcu和编译器中不停切换使用,我很少仔细看过渡性使用的编译器手册。
一般会采用保险的写法,比如楼主代码中的比较,我通通会加(unsinged char)强制转换。
所以这个隐式转换的问题我倒还没碰到过,呵呵。
点赞  2010-6-25 13:04
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复