可移植行缺陷问题


(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大小写转换,注意输入条件的合法性判断