C++没有明确规定每种数据类型的字节数,只规定了它们之间的关系,比如
short <= int <= long <= long long
实型常量默认为double类型,如果要定义浮点型,可以使用f(F)
auto i = 17.2; // i为double类型
auto j = 20.1f; // j 为float类型
char实际类型为signed char还是unsigned char由编译器决定,所以一般在使用char时要明确指定是否有符号,而且一般不要使用char进行算数运算,避免不同编译器上的差异。
明确数值不能为负数时,优选使用无符号数来表示。对于浮点数优选使用double类型,第一个精度高,第二个很多平台上double型比float型计算还快。
变量声明(declaration)是将变量名标志符、类型信息告诉编译器,不一定会引起内存的分配。变量的定义(definition)意味着给变量分配内存空间。一般除了外部变量(extern)以外,变量定义与声明等同。 变量只能被定义一次,但是可以被声明多次。
不要将有符号数和无符号数混合使用,如果有符号与无符号混合使用,则在计算前,系统会自动将有符号数转换为无符号数,然后进行运算,结果会不符合预期。
Int i = 1, j = -1; i * j = -1; // 结果正确
Int i = -1; unsigned j = 1; i * j = -1; // 结果错误,运算前会将j转换为无符号数(2^n - 1)
默认情况下,十进制字面值是带符号数,为int、long、long long中尺寸最小的那个。八进制和十六进制字面值既可能是带符号的也可能是无符号的,为int、unsigned int、long、unsigned long、long long、unsigned long long中尺寸最小者。
列表初始化用于内置类型变量时,如果存在丢失信息的风险,编译器将告警或报错
double i = 10.2; int a {i}; // 编译会告警,用i初始化变量a,会丢失精度。
double i = 10.2; int a = i; // 正常编译,编译器会进行默认转换,并丢失精度