楼上的专家能不能提醒一下还有那些操作是可能存在暗箱操作的?谢谢!
没找到C89的标准,stm8s103兄能否共享一下?
附件是C99标准。
目前的现状是C89当道,却找不到C89标准。郁闷。
-
-
StandardC99.pdf (1.04 MB)
个人感觉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类型.
仔细再看发现IARSTM8提示的并不是隐式转换的问题,而是VOLATILE的问题!晕!
溢出是溢出,类型转换是类型转换。
编译器如果检测到溢出,一般情况下都有警告。
(这里根本没有溢出,要溢出至少也得超过32767,
楼主才加到0x198,离溢出还远得很)
“通用算术转换”是C标准规定的一种规则,
如果这也有警告,估计一个程序下来,警告要差不多要上千了。
为什么没人注意为啥COSMIC把STM8S的int视为16bit的。既不是8bit,也不是32bit?
8bit我服气,32bit也还行,16bit俺不明白为啥,呵呵
得找个理由、、、
标准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
Turbo C诞生于80286的年代,16位机。
一般32位机上,int指32位,short int指16位。
百度百科:
【大小】
依据程序编译器的不同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定义。
讨论了半天,为什么没有人看看COSMIC的手册? 瞎子摸象?
强制转换是一方面,数据类型有是一方面,要充分考虑溢出的可能性,不然结果就会出错
由于在各种mcu和编译器中不停切换使用,我很少仔细看过渡性使用的编译器手册。
一般会采用保险的写法,比如楼主代码中的比较,我通通会加(unsinged char)强制转换。
所以这个隐式转换的问题我倒还没碰到过,呵呵。