CC++中的整型常识

 

很多人对C/C++中的整型不太了解,导致代码移植的时候出现问题,本人在此总结一下,若有描述错误,请务必指出,谢谢!

    a. C/C++对整型长度的规定是为了执行效率,将int定义为机器字长可以取得最大的执行速度;
    b. C/C++
中整型包括:int, char enum, C++中还包含bool类型,C99bool是一个宏,实际为_Bool;
    c. C
C++ enum 的规定有所不同,这里不描述;
    d.
修饰整型正负的有 signed unsigned,对于 int 默认为 signed;
    e.
修饰 int 大小的有 short long, 部分编译器还扩展了一些更长的整型,比如 long long __int64, C99中增加了long longunsigned long long;
    f. int
的长度 与 机器字长相同, 16位的编译器上int16,32位的编译器上int32;
    g. short int
的长度 小于等于 int 的长度,注意她们可能长度相等,这取决于编译器;
    h. long int
的长度 大于等于 int 的长度,注意她们可能长度相等,这取决于编译器;
    i. char
的长度应当可以包容得下一个字符,大部分系统中就是一个字节,而有的系统中可能是4个字节,因为这些系统中一个字符需要四个字节来描述;
    j. char
的正负取决于编译器,而编译器的决定取决于操作系统,在不同的编译器中char可能等同于signed char,也可能等同于unsigned char;

    总结:
    a.
出于效率考虑,应该尽量使用intunsigned int;
    b.
当需要指定容量的整型时,不应该直接使用shortintlong等,因为在不同的编译器上她们的容量不相同。此时应该定义她们相应的宏或类型,比如在VC++6.0中,可以如下定义:
    typedef unsigned char UBYTE;
    typedef signed char SBYTE;
    typedef unsigned short int UWord;
    typedef signed short int SWORD;
    typedef unsigned int UDWORD;
    typedef signed int SDWORD;
    typedef unsigned __int64 UQWORD;
    typedef signed __int64 SQWORD;
   
然后在代码中使用 UBYTESBYTEUWORD 等,这样当代码移植的时候只需要修改相应的类型即可。
   
定义自己的类型虽然在代码移植的时候只需要修改一处即可,但仍然属于源代码级别的修改,所以 C++ 2.0 中将这些类型定义在模板中,可以做到代码移植时无需修改代码。
    c.
在定义char时,一定要加上 signed unsigned,因为她的正负在不同的编译器上并不相同。
    d.
不要想当然的以为char1字节长,因为她的长度在不同的编译器上并不相同。

posted @ 2009-08-05 18:23  121543988  阅读(124)  评论(0编辑  收藏  举报