表示整数、字符和布尔值的算术类型合称为整型。
字符型包括:char与wchar_t,后者用于表示拓展字符集,一般用两个字节表示;
机器字长:是指计算机进行一次整数运算所能处理的二进制数据的位数(整数运算即定点整数运算)。机器字长也就是运算器进行定点数运算的字长,通常也是CPU内部数据通路的宽度。现在一般为32位即4个字节,也有64位和16位的。
算术类型的存储空间按照机器而定。一般,short类型为半个机器字长,int为一个机器字长,long为1或2个机器字长,float为一个机器字长,double为两个字,long double用3或4个字长。C++标准规定的是每个算术类型的最小存储空间,但其并不阻止编译器用更大的存储空间。如果要保证移植性,尽量用__int16 __int32 __int64吧,或者自己typedef int INT32一下。
c++中,把负值赋给unsigned对象是完全合法的,其结果是该负数对该类型的取值个数取模后的值。所以,将-1赋值给8位的unsigned char,结果是255。
在c++中:
16位系统:long是4字节,int是2字节
32位系统:long是4字节,int是4字节
在java中:
byte 1个字节
short 2个字节
char 2个字节
int 4个字节
long 8个字节
float 4个字节
double 8个字节
20: 十进制 024: 八进制 0x14:十六进制
128UL 表示unsigned long类型
L'a' 表示wchar_t类型的宽字符字面值
可以使用“\” 来让程序进行换行
初始化(初始化不是赋值):复制初始化: int a = 1024 直接初始化: int a(1024)
内置类型变量在函数体外定义的都初始化为0;
声明和定义: 定义分配存储空间,声明不分配存储空间,在定义的过程中会声明变量的类型和名字;可以用extern 来声明但不定义一个变量,只能在函数外部对extern表达式进行初始化;变量只能定义一次,但能声明多次;
extern double p = 3.14; // definition
extern double p; // ok; declaration
extern double p = 3.14 // wrong!
double p; // wrong!
extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。另外,extern也可用来进行链接指定。
非const变量默认为extern(意思是可以在其他文件被访问)、要使const变量能够在其他的文件中被访问,必须显示地指定它为extern。
非const引用必须用与该引用同类型的对象初始化,const引用则可以绑定到不同但相关的类型的对象或绑定到右值;const引用时指向const对象的引用;
const int &r = 1; // legal
double d = 3.14; const int &rd = d; // legal
枚举:
enum A{a, b, c}; enum B{d, f, g};
A m = a; // ok
A n = 1; // error, 不同类型
A l = d; // error, 不同类型
头文件包含在多个源文件里,所以不应该含有变量或函数的定义,用于声明而不是用于定义;但是可以定义类、值在编译时就已知道的const对象和inline函数;以常量表达式初始化的const变量可以放在头文件中,因为它是一个局部变量,相当于每个引用了该头文件的源文件都有一个相同的局部变量;如果没有初始化,则需使用extern来进行声明;
const double p = 3.14; // ok
extern const int a; // ok
在C++环境下使用C函数的时候,常常会出现编译器无法找到obj模块中的C函数定义,从而导致链接失败的情况,应该如何解决这种情况呢?
答案与分析:
C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern “C”进行链接指定,这告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名。
下面是一个标准的写法:
//在.h文件的头上
#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif /* __cplusplus */
…
…
//.h文件结束的地方
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */