-
c语言入门之C/C++中的整型常识
很多人对C/C++中的整型不太了解,导致代码移植的时候出现问题,本人在此总结一下,若有描述错误,请务必指出,谢谢!
a. C/C++对整型长度的规定是为了执行效率,将int定义为机器字长可以取得最大的执行速度;
b. C/C++中整型包括:int, char 和 enum, C++中还包含bool类型,C99中bool是一个宏,实际为_Bool;
c. C 和 C++ 对 enum 的规定有所不同,这里不描述;
d. 修饰整型正负的有 signed 和 unsigned,对于 int 默认为 signed;
e. 修饰 int 大小的有 short 和 long, 部分编译器还扩展了一些更长的整型,比如 long long 和 __int64, C99中增加了long long和unsigned long long;
f. int 的长度 与 机器字长相同, 16位的编译器上int长16位,32位的编译器上int长32位;
g. short int 的长度 小于等于 int 的长度,注意她们可能长度相等,这取决于编译器;
h. long int 的长度 大于等于 int 的长度,注意她们可能长度相等,这取决于编译器;
i. char 的长度应当可以包容得下一个字符,大部分系统中就是一个字节,而有的系统中可能是4个字节,因为这些系统中一个字符需要四个字节来描述;
j. char 的正负取决于编译器,而编译器的决定取决于操作系统,在不同的编译器中char可能等同于signed char,也可能等同于unsigned char;
总结:
a. 出于效率考虑,应该尽量使用int和unsigned int;
b. 当需要指定容量的整型时,不应该直接使用short、int、long等,因为在不同的编译器上她们的容量不相同。此时应该定义她们相应的宏或类型,比如在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;
然后在代码中使用 UBYTE、SBYTE、UWORD 等,这样当代码移植的时候只需要修改相应的类型即可。
定义自己的类型虽然在代码移植的时候只需要修改一处即可,但仍然属于源代码级别的修改,所以 C++ 2.0 中将这些类型定义在模板中,可以做到代码移植时无需修改代码。
c. 在定义char时,一定要加上 signed 或 unsigned,因为她的正负在不同的编译器上并不相同。
d. 不要想当然的以为char是1字节长,因为她的长度在不同的编译器上并不相同。
a. C/C++对整型长度的规定是为了执行效率,将int定义为机器字长可以取得最大的执行速度;
b. C/C++中整型包括:int, char 和 enum, C++中还包含bool类型,C99中bool是一个宏,实际为_Bool;
c. C 和 C++ 对 enum 的规定有所不同,这里不描述;
d. 修饰整型正负的有 signed 和 unsigned,对于 int 默认为 signed;
e. 修饰 int 大小的有 short 和 long, 部分编译器还扩展了一些更长的整型,比如 long long 和 __int64, C99中增加了long long和unsigned long long;
f. int 的长度 与 机器字长相同, 16位的编译器上int长16位,32位的编译器上int长32位;
g. short int 的长度 小于等于 int 的长度,注意她们可能长度相等,这取决于编译器;
h. long int 的长度 大于等于 int 的长度,注意她们可能长度相等,这取决于编译器;
i. char 的长度应当可以包容得下一个字符,大部分系统中就是一个字节,而有的系统中可能是4个字节,因为这些系统中一个字符需要四个字节来描述;
j. char 的正负取决于编译器,而编译器的决定取决于操作系统,在不同的编译器中char可能等同于signed char,也可能等同于unsigned char;
总结:
a. 出于效率考虑,应该尽量使用int和unsigned int;
b. 当需要指定容量的整型时,不应该直接使用short、int、long等,因为在不同的编译器上她们的容量不相同。此时应该定义她们相应的宏或类型,比如在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;
然后在代码中使用 UBYTE、SBYTE、UWORD 等,这样当代码移植的时候只需要修改相应的类型即可。
定义自己的类型虽然在代码移植的时候只需要修改一处即可,但仍然属于源代码级别的修改,所以 C++ 2.0 中将这些类型定义在模板中,可以做到代码移植时无需修改代码。
c. 在定义char时,一定要加上 signed 或 unsigned,因为她的正负在不同的编译器上并不相同。
d. 不要想当然的以为char是1字节长,因为她的长度在不同的编译器上并不相同。
最新更新
Objective-C语法之代码块(block)的使用
VB.NET eBook
Add-in and Automation Development In VB.NET 2003 (F
Add-in and Automation Development In VB.NET 2003 (8
Add-in and Automation Development in VB.NET 2003 (6
Add-in and Automation Development In VB.NET 2003 (5
AddIn Automation Development In VB.NET 2003 (4)
AddIn And Automation Development In VB.NET 2003 (2)
Addin and Automation Development In VB.NET 2003 (3)
AddIn And Automation Development In VB.NET 2003 (1)
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
武装你的WEBAPI-OData入门
武装你的WEBAPI-OData便捷查询
武装你的WEBAPI-OData分页查询
武装你的WEBAPI-OData资源更新Delta
5. 武装你的WEBAPI-OData使用Endpoint 05-09
武装你的WEBAPI-OData之API版本管理
武装你的WEBAPI-OData常见问题
武装你的WEBAPI-OData聚合查询
OData WebAPI实践-OData与EDM
OData WebAPI实践-Non-EDM模式