打印
[STM8]

发现STVD+Cos4.3.4 unsigned char “+”运算问题!给大家提个醒!

[复制链接]
楼主: zcxhe
手机看帖
扫描二维码
随时随地手机跟帖
21
zcxhe|  楼主 | 2010-6-24 09:12 | 只看该作者 回帖奖励 |倒序浏览
楼上的专家能不能提醒一下还有那些操作是可能存在暗箱操作的?谢谢!

使用特权

评论回复
22
mcuisp| | 2010-6-24 10:13 | 只看该作者
没找到C89的标准,stm8s103兄能否共享一下?

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

StandardC99.pdf

1.04 MB

使用特权

评论回复
23
mcuisp| | 2010-6-24 10:42 | 只看该作者
--

使用特权

评论回复
24
stm8s103| | 2010-6-24 12:12 | 只看该作者
25
yewuyi| | 2010-6-24 13:29 | 只看该作者
本帖最后由 yewuyi 于 2010-6-24 15:48 编辑

呵呵,这可真是好东西,竟然找到了国标中文本的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

使用特权

评论回复
26
zcxhe|  楼主 | 2010-6-24 14:31 | 只看该作者
个人感觉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类型.

使用特权

评论回复
27
香水城| | 2010-6-24 14:39 | 只看该作者
嘿嘿,楼主最好去建议C的标准化委员会修改规范,:lol

有规范不执行,还说是很人性化的,要标准化还有何用?:L

使用特权

评论回复
28
zcxhe|  楼主 | 2010-6-24 14:54 | 只看该作者
:lol
刚刚发现用IARSTM8会有提示:
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement Z:\workfile\STM8S\TST\stm8s103f2-zjr86x1-iar\main.c 34
这就比较好了!
Cosmic CxSTM8 啥提示都没有,有点不厚道!:lol
好好学习,天天向上!

使用特权

评论回复
29
zcxhe|  楼主 | 2010-6-24 15:15 | 只看该作者
仔细再看发现IARSTM8提示的并不是隐式转换的问题,而是VOLATILE的问题!晕!

使用特权

评论回复
30
zcxhe|  楼主 | 2010-6-24 15:16 | 只看该作者
那个C89下载不到,能不能传到21IC?谢谢!

使用特权

评论回复
31
stm8s103| | 2010-6-24 15:39 | 只看该作者
本帖最后由 stm8s103 于 2010-6-24 15:52 编辑

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

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


“通用算术转换”是C标准规定的一种规则,
如果这也有警告,估计一个程序下来,警告要差不多要上千了。

使用特权

评论回复
32
zcxhe|  楼主 | 2010-6-24 16:35 | 只看该作者
嗯!现在明白了!谢谢!

使用特权

评论回复
33
mcuisp| | 2010-6-24 17:20 | 只看该作者
本帖最后由 mcuisp 于 2010-6-24 17:24 编辑

为什么没人注意为啥COSMIC把STM8S的int视为16bit的。既不是8bit,也不是32bit?
8bit我服气,32bit也还行,16bit俺不明白为啥,呵呵
得找个理由、、、

使用特权

评论回复
34
zcxhe|  楼主 | 2010-6-24 18:24 | 只看该作者
标准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

使用特权

评论回复
35
mcuisp| | 2010-6-24 18:33 | 只看该作者
Turbo C诞生于80286的年代,16位机。

一般32位机上,int指32位,short int指16位。

使用特权

评论回复
36
mcuisp| | 2010-6-24 18:37 | 只看该作者
百度百科:
【大小】
  依据程序编译器的不同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定义。

使用特权

评论回复
37
yewuyi| | 2010-6-25 09:22 | 只看该作者
为什么没人注意为啥COSMIC把STM8S的int视为16bit的。既不是8bit,也不是32bit?
8bit我服气,32bit也还行,16bit俺不明白为啥,呵呵
得找个理由、、、
mcuisp 发表于 2010-6-24 17:20


8位MCU上,INT一般不都是16BIT的吗?

使用特权

评论回复
38
香水城| | 2010-6-25 09:31 | 只看该作者
讨论了半天,为什么没有人看看COSMIC的手册? 瞎子摸象?

使用特权

评论回复
39
txcy| | 2010-6-25 10:29 | 只看该作者
强制转换是一方面,数据类型有是一方面,要充分考虑溢出的可能性,不然结果就会出错

使用特权

评论回复
40
mcuisp| | 2010-6-25 13:04 | 只看该作者
本帖最后由 mcuisp 于 2010-6-25 13:05 编辑

由于在各种mcu和编译器中不停切换使用,我很少仔细看过渡性使用的编译器手册。
一般会采用保险的写法,比如楼主代码中的比较,我通通会加(unsinged char)强制转换。
所以这个隐式转换的问题我倒还没碰到过,呵呵。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则