C陷阱与缺陷(七)
可移植行缺陷问题
(1)参数类型提升的问题,注意取值范围的不同
(2)函数的声明方式不同
(3)标识符名称的限制,在变量命名时注意与库名专有命名冲突
如Malloc 与malloc,new等,而一些库名会采用下划线方式 _malloc, 但也有 __FILE__,因此添加下划线方式也要特别注意。建议用后下划线。
(4)整数大小
short int long
·
早期的操作系统是16位系统,
int用二字节表示,范围是-32768~32767;
long用4字节表示,范围是-2147483648~2147483647。
后来发展到32位操作系统,
int 用4字节表示,与long相同。
目前的操作系统已发展到64位操作系统,但因程序编译工艺的不同,两者表现出不同的差别:
32位编译系统:int占四字节,与long相同。
64位编译系统:int占四字节,long占8字节,long数据范围变为:-2^63~2^63-1
在标准中,并没有规定long一定要比int长,也没有规定short要比int短。
标准是这么说的:长整型至少和整型一样长,整型至少和短整型一样长。
这个的规则同样适用于浮点型long double至少和double一样长,double至少和float一样长。
至于如何实现要看编译器厂商.
short<=int<=long
short int 2个字节
int 2/4字节
long 4/8字节
long long 8字节
①long long或者long long int,它仅仅只为64位系统而生,所以它的长度只能是64bit;
②long或long int长度 long long的一半,32bit,不能是32到64之间的任何值,因为是二进制;
③short 或short int刚好又是long(long int)的一半,16bit
④int的长度没有确定的规范,这和机器的字有关系,一般微机字长位16位或32位,如果使用的机器字长位32位,那么程序中int就表示32位长,那么64位字长机器上是否意味着int表示64位长呢?这个需要大神回复。
如果在某机器上,int和long int是等价的时候,我们坚持使用long int而不是int,虽然他们的数值范围完全相同,为什么呢?
因为在另一个字长16位的机器上时候,int表示16位,那么使用int而不是long int的这个程序移植到该机器时候,程序会出错的,损害了C的易移植性特点。
(5)字符是有符号还是无符号的,程序中应该明确定义
(6)移位运算符,注意符号位的差别,同时注意移位的范围,左移右移不简单等同于乘2除2.
(7)使用空指针时,编译器不一定会报出错,指针没有初始化同样如此;
(8)程序中尽量不要使用除法运算,特别有符号位时;
(9)随机数rand的大小范围,是不一样的
(10)toupper、tolower大小写转换,注意输入条件的合法性判断