知识点
一、 C++定义了一套包括算术类型和空类型(void)在内的基本数据类型。
二、 算术类型分为两类:整型(integral type,包括字符和布尔类型在内)和浮点型。
三、 大多数机器的字节由8比特构成,字则由32(4×8)或64(8×8)比特构成,也就是4或8字节。
四、 除去布尔值和扩展的字符型之外,其他整型可以划分为带符号的(signed)和无符号的(unsigned)两种。
五、 字符型被分为了三种:char、signed char、unsigned char。类型char实际上会表现为上述两种形式中的一种,具体是哪种由编译器决定。
六、 当明确知晓数值不可能为负时,选用无符号类型;执行浮点数运算选用double。
七、 当我们把一个非布尔类型的算术值赋给布尔类型时,初始值为false则结果为0,初始值为true则结果为1。 当我们把一个布尔值赋给非布尔类型时,初始值为false则结果为0,初始值为true则结果为1。 当我们把一个浮点数赋给整数类型时,进行了近似处理。结果值将仅保留浮点数中小数点之前的部分。 当我们把一个整数值赋给浮点类型时,小数部分记为0.如果该整数所占的空间超过了浮点类型的容量,精度可能有损失。 当我们赋给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数。 例如,8比特大小的unsigned char可以表示0至255区间内的值,如果我们赋了一个区间以外的值,则实际的结果是该值对256取模后所得的余数。因此,把-1赋给8比特大小的unsigned char所得的结果是255。 当我们赋值给符号类型一个超出它表示范围的值时,结果是未定义的。 此时,程序可能继续工作、可能崩溃,也可能生成垃圾数据。
八、 当一个算术表达式中既有无符号数又有int值时,那个int值就会转换成无符号数。把int转换成无符号数的过程和把int直接赋给无符号变量一样。
九、 以0开头的整数代表八进制数,以0x和0X开头的代表十六进制数。默认情况下,十进制字面值是带符号数,八进制和十六进制字面值既可能是带符号的也可能是无符号的。
十、 浮点型字面值是一个double。
十一、 编译器在给每个字符串的结尾处添加一个空字符(‘\0’),因此,字符串字面值的实际长度要比它的内容多1。
十二、 如果反斜线\后面跟着的八进制数字超过3个,只有前3个数字与\构成转义序列。相反,\x要用到后面跟着的所有数字。
十三、
前缀 | 含义 | 类型 |
---|
u | Unicode 16字符 | char16_t | U | Unicode 32字符 | char32_t | L | 宽字符 | wchar_t | u8 | UTF-8(仅用于字符串字面常量) | char |
练习题
2.1.1节练习
练习2.1:
类型int、long、long long和 short 的区别是什么?无符号类型和带符号类型的区别是什么? float和 double的区别是什么?
int、long、long long 和short都属于整型,但是其尺寸的最小值不同。short 是短整型,占16位;int是整型,占16位;long 和long long均为长整型,均为长整形,分别占32位和64位。大多数整型都可以划分为无符号类型和带符号类型,在无符号类型中所有比特都用来存储数值,但是仅能表示大于等于0的值;带符号类型则可以表示正数、负数或0。float 和 double 分别是单精度浮点数和双精度浮点数,区别主要是在内存中所占的比特数不同,以及默认规定的有效位数不同。
练习2.2:
计算按揭贷款时,对于利率、本金和付款分别应选择何种数据类型?说明你的理由。 在实际应用中,利率、本金和付款为实数。因此应该选择一种浮点类型来表示。在三种可供选择的浮点类型 float、double和long double 中,float通常精度不够而且双精度浮点数和单精度浮点数的计算代价相差无几。long double提供的精度在一般情况下是没有必要的,况且它带来的运行时消耗也不容忽视。综上所述,我认为double类型更合适。
2.1.2节练习
练习2.3:
读程序写结果。 unsigned u = 10, u2 = 42; std::cout << u2 - u << std::endl; std::cout << u - u2 << std::endl;
int i = 10, i2 = 42; std::cout << i2 - i << std::endl; std::cout << i - i2 << std::endl; std::cout << i - u << std::endl; std::cout << u - i << std::endl;
std::cout << u2 - u << std::endl; // 32 std::cout << u - u2 << std::endl; // 取模后的值 std::cout << i2 - i << std::endl; // 32 std::cout << i - i2 << std::endl; // -32 std::cout << i - u << std::endl; // 0 std::cout << u - i << std::endl; // 0 练习2.4:编写程序检查你的估计是否正确,如果不正确,请仔细研读本节直到弄明白问题所在。
#include <iostream>
int main()
{
unsigned u = 10, u2 = 42;
std::cout << u2 - u << std::endl;
std::cout << u - u2 << std::endl;
int i = 10, i2 = 42;
std::cout << i2 - i << std::endl;
std::cout << i - i2 << std::endl;
std::cout << i - u << std::endl;
std::cout << u - i << std::endl;
return 0;
}
2.1.3节练习
练习2.5:
指出下述字面值的数据类型并说明每一组内几种字面值的区别; (a)‘a’,L’a’,“a”,L"a" (b)10,10u,10L,10uL,012,0xC (c)3.14,3.14f,3.14L (d)10,10u,10.,10e-2
(a)‘a’-【字符型字面值】,L’a’-【宽字符型字面值,类型是wchar_t】,“a”-【字符串型字面值】,L"a"-【宽字符串型字面值】 (b)10-【十进制整型字面值】,10u-【无符号整型字面值,类型是unsigned】,10L-【长整型字面值,类型是long】,10uL-【无符号长整型字面值,类型是unsigned long】,012-【八进制整型字面值】,0xC-【十六进制整型字面值】 (c)3.14-【浮点型字面值】,3.14f-【单精度浮点型字面值,类型是float】,3.14L-【扩展精度浮点型字面值,类型是long double】。 (d)10-【十进制整型字面值】,10u-【无符号整型字面值,类型是unsigned】,10.【浮点型字面值】,10e-2【浮点型字面值】
练习2.6:
下面两组定义是否有区别,如果有,请叙述之: int month = 9,day = 7; int month = 09,day = 07;
有区别,以0开头的整数代表八进制数。 所以,int month = 9,day = 7; 正确,其中9和7为十进制数,正确。而int month = 09,day = 07; 错误,其中9和7为八进制数,而八进制数中不可能出现超过7的数字。
练习2.7:
下述字面值表示何种含义?它们各自的数据类型是什么? (a)“who goes with F\145rgus?\012” (b)3.14e1L (c)1024f (d)3.14L
(a)含义:“who goes with Fergus?”,数据类型:字符串型 (b)含义:31.4,数据类型:扩展精度浮点型 (c)含义 :1024.0 ,数据类型:单精度浮点型 (d)含义:3.14 ,数据类型:扩展精度浮点型
练习2.8:
请利用转义序列编写一段程序,要求先输出2M,然后转到新一行。修改程序使其先输出2,然后输出制表符,再输出M,最后转到新一行。
#include <iostream>
int main()
{
std::cout << "2M\n";
std::cout << "2\tM\n";
return 0;
}
|